这个题目是套用dijstra()模板,但又拐了一个弯,本题每条路径上都有两个权值,本题不必考虑花费,直接球最短路,只是在更新顶点值的时候有一个特殊处理,求得花费。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int n,m,s,t;
int inf=0x7fffffff;
int hash[1010],dis[1010],map[1010][1010],pay[1010][1010],des[1010];
void dijstra()
{
dis[s]=0;
des[s]=0;
for(int i=1;i<=n;i++)
{
int r=inf,pos;
for(int j=1;j<=n;j++)
{
if(hash[j]==0)
{
if(dis[j]<r)
{
r=dis[j];
pos=j;
}
}
}
hash[pos]=1;
if(pos==t) break;
for(int j=1;j<=n;j++)
{
if(hash[j]==0)
{
if(map[pos][j]!=inf)
{
if(dis[pos]+map[pos][j]<dis[j])
{
dis[j]=map[pos][j]+dis[pos];
des[j]=pay[pos][j]+des[pos];
}
else if(map[pos][j]+dis[pos]==dis[j])
{
if(pay[pos][j]+des[pos]<des[j])
{
des[j]=pay[pos][j]+des[pos];
}
}
}
}
}
}
}
int main()
{
int a,b;
int d,p;
while(scanf("%d%d",&n,&m),m||n)
{
for(int i=1;i<=n;i++)
{
dis[i]=inf;
hash[i]=0;
des[i]=inf;
for(int j=1;j<=n;j++)
{
map[i][j]=inf;
pay[i][j]=inf;
}
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if(a!=b&&map[a][b]>=d)
{
map[a][b]=map[b][a]=d;
pay[a][b]=pay[b][a]=p;
}
/*if(a!=b&&map[a][b]>=d)
{
map[a][b]=map[b][a]=d;
}
if(a!=b&&pay[a][b]>=p)
{
pay[a][b]=pay[b][a]=p;
}*///此处为错误代码,刚开始因为写的是这个,结果一直wa,后来参考了别人的代码,将此处改了一下,结果AC了 。
}
scanf("%d%d",&s,&t);
dijstra();
printf("%d %d\n",dis[t],des[t]);
}
//system("pause");
return 0;
}
编辑器加载中...
浙公网安备 33010602011771号