您的位置:首页 > 其它

HDU 2066 一个人的旅行(最短路)

2017-11-08 11:14 369 查看
【题目链接】

http://acm.hdu.edu.cn/showproblem.php?pid=2066

题目意思

题目大意:给定n个城市,m条路(双向),每条路都有一个权值。现在给你多个起点一个终点,问最短路径是多少

解题思路

由于是多个起点,所以初始最短路数组时每个起点都初始,然后按最短路来跑就可以了

代码部分

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=1005;
const int INT=0x3f3f3f;
int n,m,t;
int a[maxn][maxn];  ///地图
int vis[maxn];
int dis[maxn];   ///存储最短路
int s[maxn];  ///存放起点
int d;
int Dis()
{
for (int i=0; i<n; i++)  ///多个起点更新dis数组初值
{
dis[s[i]]=0;
if (vis[s[i]]==2)  ///判断是否为终点(初始化时标记了终点vis为2)
return dis[s[i]];
else vis[s[i]]=1;
for (int j=0;j<1001;j++)
{
if (dis[j]>a[s[i]][j])
dis[j]=a[s[i]][j];
}
}
int mi,j,e;
for (int i=0; i<t-n; i++)
{
mi=INT;
for (int k=0; k<1001; k++)
{
if (dis[k]<mi&&vis[k]!=1)
{
mi=dis[k];
j=k;
}
}
dis[j]=mi;
for (int k=0; k<1001; k++)
{
if (vis[k]!=1)
{
if (a[j][k]+dis[j]<dis[k])
dis[k]=a[j][k]+dis[j];
}
}
if (vis[j]==2)
return dis[j];
else vis[j]=1;
}
return -1;
}
int main()
{
while(scanf("%d %d %d",&t,&n,&m)!=EOF)
{
memset(a,INT,sizeof(a));
memset(dis,INT,sizeof(dis));
memset(vis,0,sizeof(vis));
for (int i=0; i<t; i++)
{
int A,B,x;
scanf("%d %d %d",&A,&B,&x);
if (x<a[A][B])
{
a[A][B]=x;
a[B][A]=x;
}
}
for (int i=0;i<n;i++) ///输入起点
{
scanf("%d",&s[i]);
}
for (int i=0;i<m;i++)  ///标记终点
{
scanf("%d",&d);
vis[d]=2;
}
int minn=Dis();
cout<<minn<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息