题目链接:点击打开链接
pay与dis一起进行更新。
代码:
#include<cstdio> #include<cstring> #define INF 0xffffff const int N=1005; int Map[N][N],pMap[N][N]; int dis[N],pay[N]; bool vis[N]; int n,m; void Init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {Map[i][j]=INF;pMap[i][j]=INF;} } void Dijkstra(int u0) { memset(vis,0,sizeof(vis)); vis[u0]=true; for(int i=1;i<=n;i++) {dis[i]=Map[u0][i];pay[i]=pMap[u0][i];} dis[u0]=0;pay[u0]=0; // for(int k=1;k<=n;k++) // printf("(%d %d)\n",dis[k],pay[k]); for(int i=1;i<=n;i++) { int temp=INF,ptemp=INF,t=u0; for(int j=1;j<=n;j++) if(!vis[j]) { if(temp>dis[j]) {temp=dis[j];ptemp=pay[j];t=j;} else if(temp==dis[j]&&ptemp>pay[j]) {temp=dis[j];ptemp=pay[j];t=j;} } if(t==u0) return; vis[t]=true; for(int j=1;j<=n;j++) if(!vis[j]) { if(dis[j]>dis[t]+Map[t][j]) {dis[j]=dis[t]+Map[t][j];pay[j]=pay[t]+pMap[t][j];} else if(dis[j]==dis[t]+Map[t][j]&&pay[j]>pay[t]+pMap[t][j]) {dis[j]=dis[t]+Map[t][j];pay[j]=pay[t]+pMap[t][j];} } } } int main() { while(scanf("%d%d",&n,&m)&&(n+m)) { Init(); for(int i=1;i<=m;i++) { int a,b,d,p; scanf("%d%d%d%d",&a,&b,&d,&p); if(d<Map[a][b]) { Map[a][b]=d;Map[b][a]=d; pMap[a][b]=p;pMap[b][a]=p; } else if(d==Map[a][b]&&p<pMap[a][b]) { Map[a][b]=d;Map[b][a]=d; pMap[a][b]=p;pMap[b][a]=p; } } int s,t; scanf("%d%d",&s,&t); Dijkstra(s); // for(int k=1;k<=n;k++) // printf("%d %d\n",dis[k],pay[k]); printf("%d %d\n",dis[t],pay[t]); } return 0; }