HDU——3790 最短路徑問題(dijkstra演算法)
阿新 • • 發佈:2018-11-16
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 1010 #define inf 0x3fffffff using namespace std; int cost[maxn][maxn],G[maxn][maxn]; int n,m,d[maxn],c[maxn],vis[maxn]; int st,ed; void dijkstra(int s) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { d[i]=inf; c[i]=inf; } d[s]=0; c[s]=0; int MIN; int u; for(int i=1;i<=n;i++) { MIN=inf; u=-1; for(int j=1;j<=n;j++) { if(MIN>d[j]&&vis[j]==0) { MIN=d[j]; u=j; } } if(u==-1) break; vis[u]=1; for(int j=1;j<=n;j++) { if(d[j]>d[u]+G[u][j]||(d[u]+G[u][j]==d[j]&&c[j]>c[u]+cost[u][j])) { d[j]=d[u]+G[u][j]; c[j]=c[u]+cost[u][j]; } } } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { G[i][j]=inf; cost[i][j]=inf; } } for(int i=0;i<m;i++) { int a,b,c,d; scanf("%d %d %d %d",&a,&b,&c,&d); if(G[a][b]>c||(G[a][b]==c&&cost[a][b]>d)) { G[a][b]=G[b][a]=c; cost[a][b]=cost[b][a]=d; } } scanf("%d %d",&st,&ed); dijkstra(st); printf("%d %d\n",d[ed],c[ed]); } return 0; }