hdu3790(双关键字最短路)

时间:2021-09-21 09:41:46

链接:点击打开链接

题意:给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

代码:

#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m;
int d1[1005],d2[1005],vis[1005];
struct node{
int to,val,cos;
};
vector<node> G[1005];
void spfa(int S){
int i,j,u,v,w,p;
queue<int> qu;
memset(d1,INF,sizeof(d1));
memset(d2,INF,sizeof(d2));
memset(vis,0,sizeof(vis));
d1[S]=d2[S]=0;
qu.push(S);
while(qu.size()){
u=qu.front();
qu.pop();
vis[u]=0;
for(i=0;i<G[u].size();i++){
v=G[u][i].to;
w=G[u][i].val;
p=G[u][i].cos;
if(d1[v]>=d1[u]+w){ //路径相同时再更新花费
if(d1[v]==d1[u]+w)
d2[v]=min(d2[v],d2[u]+p);
else
d2[v]=d2[u]+p;
d1[v]=d1[u]+w;
if(vis[v]==0){
vis[v]=1;
qu.push(v);
}
}
}
}
}
int main(){
int i,j,u,v,p,q;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
for(i=1;i<=n;i++)
G[i].clear();
for(i=1;i<=m;i++){
scanf("%d%d%d%d",&u,&v,&p,&q);
G[u].push_back((node){v,p,q});
G[v].push_back((node){u,p,q});
}
scanf("%d%d",&u,&v);
spfa(u);
printf("%d %d\n",d1[v],d2[v]);
}
return 0;
}