您的位置:首页 > 其它

hdu 3790 最短路径问题 (Djikstra)

2015-08-28 14:43 351 查看
[align=left]Problem Description[/align]
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。

[align=left]Input[/align]
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)

[align=left]Output[/align]
输出 一行有两个数, 最短距离及其花费。

[align=left]Sample Input[/align]

3 2
1 2 5 6
2 3 4 5
1 3
0 0

[align=left]Sample Output[/align]

9 11

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1<<31-1;
int map[1004][1004][2];
int v[1004],s1[1004],s2[1004];
int n;
void dijk(int x)
{
v[x]=1;
int i;
for (i=1;i<=n;i++)
{
s1[i]=map[i][x][0];
s2[i]=map[i][x][1];
}
while (1)
{
int m1=N,m2=N,p=x;
for (i=1;i<=n;i++)
{
if (v[i]) continue;
if (m1>s1[i])
{
m1=s1[i];
m2=s2[i];
p=i;
}
else if (m1==s1[i]&&m2<s2[i])
{
m2=s2[i];
p=i;
}
}
if (p==x) break;
v[p]=1;
for (i=1;i<=n;i++)
{
if (v[i]) continue;
if (s1[i]>s1[p]+map[p][i][0])
{
s1[i]=s1[p]+map[p][i][0];
s2[i]=s2[p]+map[p][i][1];
}
else if (s1[i]==s1[p]+map[p][i][0]&&s2[i]>s2[p]+map[p][i][1])
s2[i]=s2[p]+map[p][i][1];
}
}
}
int main()
{
int m,i,j,a,b,c,d;
while (~scanf("%d%d",&n,&m))
{
if (n==0&&m==0) break;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
map[i][j][0]=N;
map[i][j][1]=N;
}
for (i=1;i<=m;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
if (map[a][b][0]>c)
{
map[a][b][0]=map[b][a][0]=c;
map[a][b][1]=map[b][a][1]=d;
}
else if (map[a][b][0]==c&&map[a][b][0]>d)
{
map[a][b][0]=map[b][a][0]=c;
map[a][b][1]=map[b][a][1]=d;
}
}
memset(v,0,sizeof(v));
scanf("%d%d",&a,&b);
dijk(a);
printf("%d %d\n",s1[b],s2[b]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: