您的位置:首页 > 其它

hdu 2066 一个人的旅行-spfa

2015-08-21 10:28 190 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAX 0x3f3f3f
#define M 10000000
using namespace std;
/*有些变量的意思你看看单词名就知道了,我基本没有缩写,可以有道词典弄一下*/
queue<int> q;
int head[2000];
int vis[2000];
int edgenum;
int t,s,d;
int mmin;
int nearbycity[2000];
int destination[2000];
int dist[2000];
struct Edge
{
int from,to,val,next;
}edge[MAX];

void addedge(int u,int v,int w)
{
Edge E={u,v,w,head[u]};
edge[edgenum]=E;
head[u]=edgenum++;
}

void spfa(int s)
{
int i,u,v;
memset(vis,0,sizeof(vis));
for(i=0;i<=1000;i++)
/*
此处不要写成for(i=0;i<=2*t;i++)
因为t是代表行数,并不是城市的个数,
所以此处最好定义为for(i=0;i<=1000;i++)
从1<=a,b<=1000可以看出
*/
dist[i]=M;
dist[s]=0;
vis[s]=1;
q.push(s);
while(!q.empty())
{
u=q.front();
q.pop();
vis[u]=0;
for(i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].to;
if(dist[v]>dist[u]+edge[i].val)
{
dist[v]=dist[u]+edge[i].val;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
for(i=1;i<=d;i++)
{
if(mmin>dist[destination[i]])
/*
这里的mmin定义要注意,定义在全局变量
不知道为什么定义成min就是不行,变量模糊
*/
{
mmin=dist[destination[i]];
}
}
}

int main()
{
int i,a,b,c;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
edgenum=0;
memset(head,-1,sizeof(head));
mmin=M;
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
for(i=1;i<=s;i++)
{
scanf("%d",&nearbycity[i]);
}
for(i=1;i<=d;i++)
{
scanf("%d",&destination[i]);
}
for(i=1;i<=s;i++)
{
spfa(nearbycity[i]);
}
printf("%d\n",mmin);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: