您的位置:首页 > 其它

hdu 3790 最短路径问题(双重权值,dijkstra算法)

2014-08-14 17:16 344 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790

题目大意:题意明了,输出最短路径及其花费。

需要注意的几点:(1)当最短路径相同时,输出最小花费!!!

(2)更新路径的时候要注意更新花费。

#include <iostream>
#include <cstdio>
using namespace std;
const int INF=9999999;
int map[1010][1010],Min,n,cost[1010][1010],node[1010],vis[1010];
int pr[1010];

void set()
{
for (int i=1; i<=n; i++)
{
vis[i]=0;
node[i]=INF;
pr[i]=INF;
for (int j=1; j<=n; j++)
{
map[i][j]=INF;
cost[i][j]=INF;
}
}
}

void dijkstra(int m)
{
int tm=m;
vis[m]=1;
node[m]=0;
pr[m]=0;
for (int k=2; k<=n; k++)
{
Min=INF;
int M=INF;
for (int i=1; i<=n; i++)
if(!vis[i])
{
if (node[i]>map[tm][i]+node[tm])
{
node[i]=map[tm][i]+node[tm];
pr[i]=cost[tm][i]+pr[tm];
}
else if(node[i]==map[tm][i]+node[tm])
{
if(pr[i]>cost[tm][i]+pr[tm])
{
node[i]=map[tm][i]+node[tm];
pr[i]=cost[tm][i]+pr[tm];
}
}
if (Min>node[i])
{
M=pr[i];
Min=node[i];
m=i;
}
else if (Min==node[i])
{
if(M>pr[i])
{
M=pr[i];
Min=node[i];
m=i;
}
}
}
vis[m]=1;
tm=m;
}
}

int main ()
{
int a,b,d,p,m;
while(scanf("%d%d",&n,&m),n||m)
{
set();
while (m--)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if (map[a][b]>d)
{
cost[a][b]=cost[b][a]=p;
map[a][b]=map[b][a]=d;
}
else if (map[a][b]==d)
{
if (cost[a][b]>p)
cost[a][b]=cost[b][a]=p;
}
}
scanf("%d%d",&a,&b);
dijkstra(a);
printf ("%d %d\n",node[b],pr[b]);
}
}


一种简单明了的代码。

#include <iostream>
#include <cstdio>

using namespace std;

const int INF=9999999;

int Map[1010][1010],Min,Mmin,n,cost[1010][1010],node[1010],vis[1010];
int pr[1010],tm;

void sett()
{
for (int i=1; i<=n; i++)
{
node[i]=INF;
vis[i]=0;
pr[i]=INF;
for (int j=1; j<=n; j++)
{
Map[i][j]=INF;
cost[i][j]=INF;
}
}
}

int dijkstra()
{
for (int i=1; i<=n; i++)
{
Min=INF;
Mmin=INF;
for (int j=1; j<=n; j++)
{
if (!vis[j])
{
if (Min>node[j])
{
Min=node[j];
Mmin=pr[j];
tm=j;
}
else if (Min==node[j])
{
if (Mmin>pr[j])
{
Mmin=pr[j];
tm=j;
}
}
}
}
vis[tm]=1;
for (int j=1; j<=n; j++)
if (!vis[j])
{
if (node[j]>Map[tm][j]+node[tm])
{
node[j]=Map[tm][j]+node[tm];
pr[j]=cost[tm][j]+pr[tm];
}
else if (node[j]==Map[tm][j]+node[tm])
{
if (pr[j]>cost[tm][j]+pr[tm])
{
node[j]=Map[tm][j]+node[tm];
pr[j]=cost[tm][j]+pr[tm];
}
}
}
}
}

int main ()
{
int m,a,b,d,p,s,t;
while (~scanf("%d%d",&n,&m))
{
if (n==0&&m==0)
break;
sett();
for (int i=1; i<=m; i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);
if (Map[a][b]>d)
{
Map[a][b]=Map[b][a]=d;
cost[a][b]=cost[b][a]=p;
}
else if (Map[a][b]==d)
{
if (cost[a][b]>p)
cost[a][b]=cost[b][a]=p;
}
}
scanf("%d%d",&s,&t);
node[s]=0;
pr[s]=0;
dijkstra();
printf ("%d %d\n",node[t],pr[t]);
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: