地址:http://acm.hdu.edu.cn/showproblem.php?pid=3790
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5246 Accepted Submission(s): 1588
#include <stdio.h> #include <string.h> #define INF 9999999 int map[1001][1001]; int cost[1001][1001]; int n,m,a,b,d,p,s,t; int dist[1001]; bool visit[1001]; int c[1001]; /*void floyd() { int i,j,k; for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(map[i][j]>=map[i][k]+map[k][j]) { map[i][j]=map[i][k]+map[k][j]; if(cost[i][j]>cost[i][k]+cost[k][j]) cost[i][j]=cost[i][k]+cost[k][j]; } }*/ void dijkstra(int x,int y) { int next,i,j,min; memset(visit,false,sizeof(visit)); for(i=1;i<=n;i++) { dist[i]=INF; c[i]=INF; } dist[x]=0; c[x]=0; for(j=1;j<=n;j++) { min=INF; for(i=1;i<=n;i++) if(!visit[i]&&dist[i]<min) min=dist[next=i]; if(min==INF) break; visit[next]=true; for(i=1;i<=n;i++) if(!visit[i]&&dist[i]>=dist[next]+map[next][i]) { if(dist[i]==dist[next]+map[next][i]) { if( c[i]>c[next]+cost[next][i]) c[i]=c[next]+cost[next][i]; } else { dist[i]=dist[next]+map[next][i]; c[i]=c[next]+cost[next][i]; } } } } int main() { while(scanf("%d%d",&n,&m)==2&&(m+n)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { map[i][j]=INF; cost[i][j]=INF; } while(m--) { scanf("%d%d%d%d",&a,&b,&d,&p); if(map[a][b]>d) { map[a][b]=map[b][a]=d; cost[a][b]=cost[b][a]=p; //正确的输入应该是以短路经为主,只需比较路径 } /*if(p<cost[a][b]) cost[a][b]=cost[b][a]=p;*/ //原来的输入,路径和花费分别判断 } scanf("%d%d",&s,&t); dijkstra(s,t); printf("%d %d\n",dist[t],c[t]); } return 0; }