您的位置:首页 > 其它

HDU2066:一个人的旅行(Dijkstra)

2016-04-13 18:17 344 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2066

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>

using namespace std;

const int inf=1<<30;

int T,S,D,n;
int maps[1111][1111];
int vis[1111];
int cast[1111];
int s[1111],e[1111];

void Dijkstra()
{
int i,j,minn,pos;
memset(vis,0,sizeof(vis));

vis[0]=1;

for(i=0;i<=n;i++)
cast[i]=maps[0][i];

for(i=1;i<=n;i++)
{
minn=inf;
for(j=1;j<=n;j++)
{
if(cast[j]<minn&&!vis[j])
{
pos=j;
minn=cast[j];
}
}

vis[pos]=1;

for(j=1;j<=n;j++)
{
if(cast[pos]+maps[pos][j]<cast[j]&&!vis[j])
cast[j]=cast[pos]+maps[pos][j];
}
}
}
int main()
{
int i,j,x,y,z,start,end;
while(~scanf("%d%d%d",&T,&S,&D))
{
n = 0;
for(i = 0; i<1111; i++)
{
for(j = 0; j<1111; j++)
maps[i][j] = inf;
maps[i][i] = 0;
}
while(T--)
{
scanf("%d%d%d",&x,&y,&z);
n = max(max(n,x),y);
if(z<maps[x][y])
maps[x][y] = maps[y][x] = z;
}
int minn = inf;
for(i = 0; i<S; i++)
{
scanf("%d",&s[i]);
maps[0][s[i]] = maps[s[i]][0] = 0;
}
for(i = 0; i<D; i++)
scanf("%d",&e[i]);
Dijkstra();
for(i = 0; i<D; i++)
minn = min(minn,cast[e[i]]);
printf("%d\n",minn);
}
}


智障了,刚开始以多个源点算的,WA,后来看了题解可以将源点连在一起。

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