这道题值得一做,每条边有两个费用,第二个费用从属于第一个费用
#include<iostream>
#include<cstring>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
int dis[1005][1005],dis1[1005][1005];
int cost[1005],cost1[1005];
bool vis[1005];
int n,m;
void dijkstra(int s,int t){
int i,j;
int mini,pos;
for(i=1;i<=n;i++){
vis[i]=0;
cost[i]=dis[s][i];
cost1[i]=dis1[s][i];
}
vis[s]=1;
cost[s]=0;
cost1[s]=0;
for(i=1;i<=n-1;i++){
mini=INF;
pos=i;
for(j=1;j<=n;j++)
if(!vis[j]&&cost[j]<mini){
mini=cost[j];
pos=j;
}
if(mini>=INF||pos==t) break;
vis[pos]=1;
for(j=1;j<=n;j++)
if(!vis[j]){
if(cost[j]>cost[pos]+dis[pos][j]){
cost[j]=cost[pos]+dis[pos][j];
cost1[j]=cost1[pos]+dis1[pos][j];
}
else if(cost[j]==cost[pos]+dis[pos][j])
if(cost1[j]>cost1[pos]+dis1[pos][j])
cost1[j]=cost1[pos]+dis1[pos][j];
}
}
printf("%d %d\n",cost[t],cost1[t]);
}
int main(){
int a,b,d,p;
int s,t;
while(scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
memset(dis,0x3f,sizeof(dis));
memset(dis1,0x3f,sizeof(dis1));
while(m--){
scanf("%d%d%d%d",&a,&b,&d,&p);
if(d<dis[a][b]){
dis[a][b]=dis[b][a]=d;
dis1[a][b]=dis1[b][a]=p;
}
else if(d==dis[a][b])
if(p<dis1[a][b])
dis1[a][b]=dis1[b][a]=p;
}
scanf("%d%d",&s,&t);
dijkstra(s,t);
}
return 0;
}