基础的dijkstra问题 加上了花费
#include<bits/stdc++.h> using namespace std; int m1[1005][1005][2]; int vis[1005];int dis[1005]; #define INF 99999 int n,e,cas; int m; int cos1[1000]; void dijkstra(int v0) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){dis[i]=(i==v0?0:INF);cos1[i]=(i==v0?0:INF);} vis[v0]=1; for(int i=0;i<n-1;i++) { int minn=INF,u=v0; for(int j=1;j<=n;j++) { if(vis[j]==0&&dis[j]<minn) { u=j;minn=dis[j]; } } vis[u]=1; for(int j=1;j<=n;j++) { if(dis[u]+m1[u][j][0]<dis[j]) { dis[j]=dis[u]+m1[u][j][0]; cos1[j]=cos1[u]+m1[u][j][1]; } else if(dis[u]+m1[u][j][0]==dis[j]&&cos1[u]+m1[u][j][1]<cos1[j]) { cos1[j]=cos1[u]+m1[u][j][1]; } } } } int main() { while(scanf("%d%d",&n,&m)==2&&(n+m) ) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j)m1[i][j][0]=m1[i][j][1]=0; else m1[i][j][0]=m1[i][j][1]=INF; } while(m--) { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); if( m1[a][b][0]>c ) { m1[a][b][0]=m1[b][a][0]=c; m1[a][b][1]=m1[b][a][1]=d; } else if(m1[a][b][0]==c&&d<m1[a][b][1]) { m1[a][b][1]=m1[b][a][1]=d; } } int s,e; scanf("%d%d",&s,&e); dijkstra(s); printf("%d %d\n",dis[e],cos1[e]); } }
回顾:
#include<iostream> #include<queue> #include<cstdio> #include<cstring> #include<vector> using namespace std; #define N 1005 #define inf 0x3f3f3f3f int n,e,m,s; int vis[N],dis[N],mp[N][N]; int cost[N][N],cos[N]; void dijkstra(int s) { memset(vis,0,sizeof vis); for(int i=1;i<=n;i++) dis[i]=inf; dis[s]=0; for(int i=1;i<=n;i++) cos[i]=inf; cos[s]=0; for(int i=1;i<=n;i++) { int minn=inf,u=-1; for(int j=1;j<=n;j++) if(dis[j]<minn&&!vis[j]) { minn=dis[j];u=j; } if(u==-1)return ; vis[u]=1; for(int j=1;j<=n;j++) { if(dis[j]>dis[u]+mp[u][j]) { dis[j]=dis[u]+mp[u][j]; cos[j]=cos[u]+cost[u][j]; } else if(dis[j]==dis[u]+mp[u][j]) { cos[j]=min(cos[j],cos[u]+cost[u][j]); } } } } int main() { while(scanf("%d%d",&n,&m)==2&&(n+m)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j)mp[i][i]=0; else mp[i][j]=inf; if(i==j)cost[i][i]=0; else cost[i][j]=inf; } while(m--) { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); if(mp[a][b]>c) mp[a][b]=mp[b][a]=c,cost[a][b]=cost[b][a]=d; } scanf("%d%d",&s,&e); dijkstra(s); printf("%d %d\n",dis[e],cos[e]); } return 0; }