HDU3790 最短路径问题
1 #include<stdio.h> 2 #include<string.h> 3 #define MAX 0x7ffffff 4 struct G { 5 int d; 6 int p; 7 }map[1001][1001]; 8 struct D { 9 int d; 10 int p; 11 }dist[1001]; 12 bool vis[1001]; 13 int m,n,s,e; 14 void dijkstra() 15 { 16 int i,j,k,min; 17 for(i=1;i<n;i++){ 18 for(min=MAX,j=1;j<=n;j++){ 19 if(!vis[j]&&min>dist[j].d){ 20 min=dist[j].d; 21 k=j; 22 } 23 } 24 vis[k]=1; 25 for(j=1;j<=n;j++){ 26 if(!vis[j]){ 27 if(dist[j].d>dist[k].d+map[k][j].d){ 28 dist[j].d=dist[k].d+map[k][j].d; 29 dist[j].p=dist[k].p+map[k][j].p; 30 }else if(dist[j].d==dist[k].d+map[k][j].d&&dist[j].p>dist[k].p+map[k][j].p){ 31 dist[j].p=dist[k].p+map[k][j].p; 32 } 33 } 34 } 35 } 36 printf("%d %d\n",dist[e].d,dist[e].p); 37 } 38 void init() 39 { 40 int i,j; 41 int a,b,d,p; 42 for(i=1;i<=n;i++){ 43 for(j=1;j<=n;j++){ 44 map[i][j].d=map[j][i].d=MAX; 45 map[i][j].p=map[j][i].p=MAX; 46 } 47 map[i][i].d=map[i][i].p=0; 48 } 49 for(i=0;i<m;i++) { 50 scanf("%d%d%d%d",&a,&b,&d,&p); 51 if(map[a][b].d>d){ 52 map[a][b].d=map[b][a].d=d; 53 map[a][b].p=map[b][a].p=p; 54 }else if(map[a][b].d==d&&map[a][b].p>p){ 55 map[a][b].p=map[b][a].p=p; 56 } 57 } 58 scanf("%d%d",&s,&e); 59 for(i=1;i<=n;i++){ 60 dist[i].d=map[s][i].d; 61 dist[i].p=map[s][i].p; 62 } 63 memset(vis,0,sizeof(vis)); 64 vis[s]=1; 65 dist[s].d=dist[s].p=0; 66 } 67 int main() 68 { 69 while(scanf("%d%d",&n,&m),n||m){ 70 init(); 71 dijkstra(); 72 } 73 return 0; 74 }
我用dijkstra做的,还可以用其他方法去做!如:SPFA