您的位置:首页 > 其它

hdu 2066 一个人的旅行

2014-08-16 11:45 337 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066

题目大意:这是一个不同于其他最短路模板的题目,他特别的地方是起点不同,起点有不同个,来求到达终点的最短路。注意时间问题,以防超时~~

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
int n,Min,MM,map[1010][1010],d,node[1010],p[1010],q[1010];
const int INF=999999;

void set ()
{
for (int i=1; i<1010; i++)
{
node[i]=INF;
for (int j=1; j<1010; j++)
map[i][j]=INF;
}
}

int dijkstra(int m)
{
int vis[1010]= {0};
int tm=m;
vis[m]=1;
node[m]=0;
for (int k=2; k<=n; k++)
{
Min=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];
if (Min>node[i])
{
Min=node[i];
m=i;
}
}
vis[m]=1;
tm=m;
for (int j=1; j<=d; j++)
if (q[j]==tm)
return Min;
}
return -1;
}

int main ()
{
int T,s;
while (~scanf("%d%d%d",&T,&s,&d))
{
//cout<<d<<endl;
set();
n=0;
//cout<<d<<endl;
while (T--)
{
int a,b,t;
scanf("%d%d%d",&a,&b,&t);
//cout<<1<<endl;
if (a>n)
n=a;
else if (b>n)
n=b;
if (map[a][b]>t)
map[a][b]=map[b][a]=t;
}
for (int i=1; i<=s; i++)
scanf("%d",&p[i]);
for (int j=1; j<=d; j++)
scanf("%d",&q[j]);
MM=INF;
for (int i=1; i<=s; i++)
{
int w=dijkstra(p[i]);
if (MM>w&&w!=-1)
MM=w;
}
printf ("%d\n",MM);
}
return 0;
}


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