HDU1874畅通工程续(floyd||dijkstra)
看了看floyd和dijkstra,然后就找了两个练习来捉
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<map> 5 #include<vector> 6 #include<set> 7 #include<stack> 8 #include<queue> 9 #include<algorithm> 10 #include<stdlib.h> 11 using namespace std; 12 #define MAX(a,b) (a > b ? a : b) 13 #define MIN(a,b) (a < b ? a : b) 14 #define MAXN 10000001 15 #define INF 1000000007 16 #define mem(a) memset(a,0,sizeof(a)) 17 18 int w[200][200]; 19 int d[200]; 20 int vis[200]; 21 int n; 22 23 void dijkstra(int s) 24 { 25 d[s]=0; 26 for(int k=0;k<n;k++) 27 { 28 int m=INF; 29 for(int i=0;i<n;i++) 30 { 31 if(!vis[i] && d[i]<=m) 32 m=d[s=i]; 33 } 34 vis[s] = 1; 35 for(int i=0;i<n;i++) 36 { 37 d[i]=MIN(d[i], d[s]+w[s][i]); 38 } 39 } 40 } 41 42 /* 43 void floyd() 44 { 45 for(int k=0;k<n;k++) 46 { 47 for(int i=0;i<n;i++) 48 { 49 for(int j=0;j<n;j++) 50 { 51 w[i][j] = MIN(w[i][j], w[i][k] + w[k][j]); 52 } 53 } 54 } 55 } 56 */ 57 58 int main() 59 { 60 //freopen("in.txt","r",stdin); 61 //freopen("out.txt","w",stdout); 62 int m; 63 while(~scanf("%d%d",&n,&m)) 64 { 65 mem(vis); 66 for(int i=0;i<n;i++) 67 { 68 d[i]=INF; 69 for(int j=0;j<n;j++) 70 { 71 w[i][j]=INF; 72 } 73 } 74 int a,b,x; 75 for(int i=0;i<m;i++) 76 { 77 scanf("%d%d%d",&a,&b,&x); 78 if(w[a][b]>x)w[a][b] = w[b][a] = x; 79 } 80 int s,t; 81 scanf("%d%d",&s,&t); 82 if(s==t){printf("0\n");continue;} 83 84 dijkstra(s); printf("%d\n",d[t] == INF?-1 : d[t]); 85 86 // floyd(); printf("%d\n",w[s][t]==INF?-1:w[s][t]); 87 88 89 } 90 return 0; 91 }