直接套用dijstra算法,记得更新花费。
这题被坑了,同一条路居然有不同的距离和花费,所以赋值map的时候就要注意了,记得更新呀。。。
#include<stdio.h> #include<string.h> #define INF 200000000 int map[1001][1001],mapc[1001][1001],visit[1001],dist[1001],cost[1001],n; int dijstra(int s,int t) { int i,j,k,min,min1,v; memset(visit,0,sizeof(visit)); for(i=1;i<=n;i++) { dist[i]=map[s][i]; cost[i]=mapc[s][i]; } dist[s]=0; cost[s]=0; visit[s]=1; for(i=1;i<=n;i++) { for(j=1,min=INF,v=s;j<=n;j++) { if(dist[j]<min&&visit[j]!=1) { min=dist[j]; v=j; } } for(j=1;j<=n;j++) { if(dist[v]+map[v][j]<dist[j]) { dist[j]=dist[v]+map[v][j]; cost[j]=cost[v]+mapc[v][j]; } else if(dist[v]+map[v][j]==dist[j]) { if(cost[v]+mapc[v][j]<cost[j]) { cost[j]=cost[v]+mapc[v][j]; } } } visit[v]=1; } printf("%d %d\n",dist[t],cost[t]); } int main() { int m,a,b,d,p,i,j,k,s,t; while(scanf("%d%d",&n,&m)!=EOF&&(n!=0||m!=0)) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { map[i][j]=INF; mapc[i][j]=INF; } for(i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if(map[a][b]>d) { map[a][b]=d; map[b][a]=d; mapc[a][b]=p; mapc[b][a]=p; } else if(mapc[a][b]==d) { if(mapc[a][b]>p) { mapc[a][b]=p; mapc[b][a]=p; } } } scanf("%d%d",&s,&t); dijstra(s,t); } return 0; }