连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。
在同一行中输出路径长度和收费总额,数据间用空格间隔。
1 4 5 0 3 0 1 1 20 1 3 2 30 0 3 4 10 0 2 2 20 2 3 1 20
3 40
#include<bits/stdc++.h> using namespace std; const int INF=20000000; const int Maxn=1000; int Map[Maxn][Maxn]; int con[Maxn][Maxn]; int n,m,s,d; int Floyd() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { for(int k=0;k<n;k++) { if((Map[j][k]>Map[j][i]+Map[i][k])||(Map[j][k]==Map[j][i]+Map[i][k]&&con[j][k]>con[j][i]+con[i][k])) { Map[j][k]=Map[j][i]+Map[i][k]; con[j][k]=con[j][i]+con[i][k]; } } } } printf("%d %d\n",Map[s][d],con[s][d]); } int main() { int T; while(~scanf("%d",&T)) { while(T--) { scanf("%d%d%d%d",&n,&m,&s,&d); for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) { if(i==j) Map[i][j]=con[i][j]=0; else Map[i][j]=con[i][j]=INF; } } for(int i=0;i<m;i++) { int u,v,w,x; scanf("%d%d%d%d",&u,&v,&w,&x); if(Map[u][v]>w) {Map[u][v]=Map[v][u]=w; con[u][v]=con[v][u]=x; } } Floyd(); } } return 0; }
#include<bits/stdc++.h> using namespace std; const int INF=100000000; const int Maxn=1000000; int n,m,s,d,Lsum=0,Msum=0; struct node { int L,M,u,v; } edge[Maxn]; int dis[Maxn],con[Maxn]; int Bellman() { for(int i=0; i<=n; i++) { dis[i]=INF; con[i]=INF; } dis[s]=0; con[s]=0; for(int i=1; i<n; i++) { for(int j=0; j<2*m; j++) { if((edge[j].L+dis[edge[j].u]<dis[edge[j].v])||((edge[j].L+dis[edge[j].u]==dis[edge[j].v])&&(edge[j].M+con[edge[j].u]<con[edge[j].v]))) { dis[edge[j].v]=edge[j].L+dis[edge[j].u]; con[edge[j].v]=con[edge[j].u]+edge[j].M; } } } printf("%d %d\n",dis[d],con[d]); } int main() { int T,v,u,w,x; while(~scanf("%d",&T)) { while(T--) { scanf("%d%d%d%d",&n,&m,&s,&d); int num=0; for(int i=0; i<m; i++) { scanf("%d%d%d%d",&u,&v,&w,&x); edge[num].L=w; edge[num].M=x; edge[num].u=u; edge[num++].v=v; edge[num].L=w; edge[num].M=x; edge[num].v=u; edge[num++].u=v; } Bellman(); } } return 0; }