9OJ-最短路径问题
http://ac.jobdu.com/problem.php?pid=1008
#include<iostream> #include<cstdio> #include<cstring> #define INF 0xfffffff using namespace std; int map[1005][1005],money[1005][1005],dis[1005],pri[1005],sign[1005]; int main(void) { int n,m,i,a,b,d,p,s,t,dmin,pmin,u; while(scanf("%d%d",&n,&m),n||m) { memset(map,-1,sizeof(map)); memset(sign,0,sizeof(sign)); while(m--) { scanf("%d%d%d%d",&a,&b,&d,&p); if(map[a][b]==-1||map[a][b]>d) { map[a][b]=map[b][a]=d; money[a][b]=money[b][a]=p; } else if(map[a][b]==d&&money[a][b]>p) money[a][b]=money[b][a]=p; } scanf("%d%d",&s,&t); for(i=1;i<=n;i++) { dis[i]=map[s][i]; pri[i]=money[s][i]; } sign[s]=1; dis[s]=pri[s]=0; while(1) { dmin=pmin=INF; for(i=1;i<=n;i++) if(!sign[i]&&dis[i]>0) { if(dis[i]<dmin) { u=i; dmin=dis[u]; } else if(dis[i]==dmin&&pri[i]<pmin) { u=i; pmin=pri[u]; } } sign[u]=1; if(u==t) break; for(i=1;i<=n;i++) if(!sign[i]&&map[u][i]>0) { if(dis[i]==-1||dis[u]+map[u][i]<dis[i]) { dis[i]=dis[u]+map[u][i]; pri[i]=pri[u]+money[u][i]; } else if(dis[u]+map[u][i]==dis[i]&&pri[u]+money[u][i]<pri[i]) pri[i]=pri[u]+money[u][i]; } } printf("%d %d\n",dis[t],pri[t]); } return 0; }
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号