poj 3767 I Wanna Go Home (有限制的最短路)

http://poj.org/problem?id=3767

  1 #include<stdio.h>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<cmath>
  6 #include<queue>
  7 #include<set>
  8 #include<map>
  9 #define Min(a,b)  a>b?b:a
 10 #define Max(a,b)  a>b?a:b
 11 #define CL(a,num)  memset(a,num,sizeof(a));
 12 #define inf 9999999
 13 #define maxn 1030
 14 #define eps  1e-6
 15 using namespace std;
 16 int n,m;
 17 int mat[maxn][maxn],vis[maxn],pre[maxn],f[maxn],dis[maxn];
 18 void init()
 19 {
 20     for(int i=0; i<=n;i++)
 21     {
 22         for(int j=0;j<=n;j++)
 23             mat[i][j]=inf;
 24     }
 25 }
 26 void dij()
 27 {
 28     int i,j,k;
 29 
 30     for(i=0;i<=n;i++)
 31     {
 32         dis[i]=inf;
 33         vis[i]=0;
 34         pre[i]=0;
 35     }
 36     dis[1]=0;
 37     pre[1]=1;
 38     for(i=0;i<n;i++)
 39     {
 40         int min=inf;
 41         for(j=1;j<=n;j++)
 42         {
 43             if(!vis[j]&&dis[j]<min)
 44             {
 45                 min=dis[j];
 46                 k=j;
 47             }
 48         }
 49         vis[k]=1;
 50 
 51         for(j=1;j<=n;j++)
 52         {
 53 
 54 
 55 
 56 
 57             if(!vis[j]&mat[k][j]!=inf&&dis[j]>dis[k]+mat[k][j])
 58             {
 59 
 60 
 61 
 62                 dis[j]=dis[k]+mat[k][j];
 63 
 64             }
 65         }
 66 
 67     }
 68 }
 69 int main()
 70 {
 71     int i,x,y,z,a,j;
 72     while(scanf("%d",&n),n)
 73     {
 74         scanf("%d",&m);
 75         init();
 76         for(i=1;i<=m;i++)
 77         {
 78             scanf("%d%d%d",&x,&y,&z);
 79             mat[x][y]=mat[y][x]=z;
 80         }
 81         for(i=1;i<=n;i++)
 82         {
 83           scanf("%d",&f[i]);
 84 
 85         }
 86         for(i=1;i<=n;i++)
 87         {
 88             for(j=1;j<=n;j++)
 89             {
 90                 if(f[i]!=f[j])
 91                 {
 92                     if(f[i]==1&&f[j]==2)
 93                         mat[j][i]=inf;
 94                     else
 95                        if(f[j]==1&&f[i]==2)
 96                         mat[i][j]=inf;
 97                 }
 98             }
 99         }
100         dij();
101         if(dis[2]!=inf)printf("%d\n",dis[2]);
102         else printf("-1\n");
103     }
104 
105 }
原文地址:https://www.cnblogs.com/acSzz/p/2616380.html