您的位置:首页 > 其它

HDU 3790 最短路径问题

2016-05-24 16:06 337 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790

题目大意:就是找出最短路经同时输出最短路经所对应的花费,若有多个最短路径输出花费较少的路径。

思路:就是定义两个二维数组,一个用来储存最短路径,一个用来储存花费。然后找出你最短路经,将最短路径的每条路的花费相加即可。

具体代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<climits>
#include<queue>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int Max=1005;
int map[Max][Max],vis[Max],dis[Max],money[Max],price[Max][Max];
int i,j;
int s,t;
int n,m;
void Dijkstar()//迪杰斯特拉的方法
{
memset(vis,0,sizeof(vis));
int pos=s;
vis[pos]=1;
for(i=1; i<=n; i++)
{
dis[i]=map[pos][i];
money[i]=price[pos][i];
}//初始化距离和花费
for(i=0; i<n-1; i++)
{
int min=INF;
for(j=1; j<=n; j++)
{
if(vis[j]==0&&dis[j]<min)
{
min=dis[j];
pos=j;
}
}//找出最短路径
vis[pos]=1;
for(j=1; j<=n; j++)
{
if(map[pos][j]<INF&&vis[j]==0)
{
if(dis[j]>dis[pos]+map[pos][j])
{
dis[j]=dis[pos]+map[pos][j];
money[j]=money[pos]+price[pos][j];
}/更新dis数组,同时更新money数组
else if(dis[j]==dis[pos]+map[pos][j]&&money[j]>money[pos]+price[pos][j])//相同时选择花费较小的路径
{
money[j]=money[pos]+price[pos][j];
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)&&(n+m))
{
int a,b,d,p;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
map[i][j]=INF;
price[i][j]=INF;
}
}//初始化map,和price数组
for(i=1; i<=m; i++)
{
scanf("%d%d%d%d",&a,&b,&d,&p);//这里没有用cin读入,学长说用cin读入运行的慢会超时,而用scanf读入会避免超时
if(d<map[a][b])
{
map[a][b]=map[b][a]=d;
price[a][b]=price[b][a]=p;
}
else if(d==map[a][b]&&p<price[a][b])
{
price[a][b]=price[b][a]=p;
}
}
cin>>s>>t;
Dijkstar();
printf("%d %d\n",dis[t],money[t]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最短路径