#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define inf 0x7f7f7f7f
#define N 1010
int n,m;
int edge[N][N];
int pay[N][N];
int dis[N],co[N];
queue<int> p;
bool vis[N];
void spfa(int st){
while(!p.empty()) p.pop();
fill(dis+1,dis+n+1,inf);
fill(co+1,co+n+1,inf);
memset(vis,0,sizeof(vis));
vis[st]=1;
co[st]=0;
dis[st]=0;
p.push(st);
while(!p.empty()){
int temp=p.front();
p.pop();
for(int i=1;i<=n;i++){
if(dis[i]>dis[temp]+edge[temp][i]&&edge[temp][i]!=inf){
dis[i]=dis[temp]+edge[temp][i];
co[i]=co[temp]+pay[temp][i];
if(!vis[i]){
vis[i]=1;
p.push(i);
}
}
else if(dis[i]==dis[temp]+edge[temp][i]){
if(co[i]>co[temp]+pay[temp][i]){
co[i]=co[temp]+pay[temp][i];
if(!vis[i]){
vis[i]=1;
p.push(i);
}
}
}
}
vis[temp]=0;
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
if(!n&&!m) break;
for(int i=1;i<=n;i++){
fill(edge[i]+1,edge[i]+n+1,inf);
fill(pay[i]+1,pay[i]+1+n,inf);
; }
int r,c,len,cost;
for(int i=0;i<m;i++){
scanf("%d%d%d%d",&r,&c,&len,&cost);
if(edge[r][c]>len){
edge[r][c]=len;
edge[c][r]=len;
pay[r][c]=cost;
pay[c][r]=cost;
}
else if(edge[r][c]==len){
if(pay[r][c]>cost){
pay[r][c]=cost;
pay[c][r]=cost;
}
}
}
int st,ed;
scanf("%d%d",&st,&ed);
spfa(st);
printf("%d %d\n",dis[ed],co[ed]);
}
return 0;
}
水题,就是复习下spfa算法。。
hdu_3790 最短路径问题 spfa
最新推荐文章于 2019-09-02 10:06:42 发布