hdu 2066 最短路水题

题意:给出多个可选择的起始点和终点,求最短路

 

思路:执行起始点次的spfa即可

 

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN   1100
#define MAXM   5000
#define inf 2000000000
struct Edge
{
	int to,next;
	int time;
}edge[MAXM];
int ans,tot;
int pre[MAXM],head[MAXM],que[MAXM];
int vis[MAXM],dis[MAXM],tar[MAXN];
void addedge(int u,int v,int c)
{
	edge[tot].to=v;
	edge[tot].next=head[u];
	edge[tot].time=c;
	head[u]=tot++;
	edge[tot].to=u;
	edge[tot].next=head[v];
	edge[tot].time=c;
	head[v]=tot++;
}
void spfa(int s)
{
	memset(vis,0,sizeof(vis));
	for(int i=0;i<MAXN;i++)
		dis[i]=inf;
	dis[s]=0;
	vis[s]=true;
	int front,rear;
	front=rear=0;
	que[rear++]=s;
	while(front!=rear)
	{
		int pre=que[front++];
		vis[pre]=true;
		int v;
		for(int j=head[pre];j!=-1;j=edge[j].next)
		{
			v=edge[j].to;
			if(dis[v]>dis[pre]+edge[j].time)
			{
				dis[v]=dis[pre]+edge[j].time;
				if(tar[v]==1)
				{
					if(dis[v]<ans)
						ans=dis[v];
				}
				if(!vis[v])
				{
					vis[v]=true;
					que[rear++]=v;
				}
			}
		}
		vis[pre]=false;
	}
}
void Init()
{
	tot=0;
	memset(head,-1,sizeof(head));
}
int si[MAXN];
int main()
{
	int T,S,D;
	while(scanf("%d%d%d",&T,&S,&D)!=EOF)
	{
		int a,b,c;
		Init();
		ans=inf;
		for(int i=0;i<T;i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			addedge(a,b,c);
		}

		memset(tar,0,sizeof(tar));
		for(int i=0;i<S;i++)
		{
			scanf("%d",&si[i]);
		}
		for(int i=0;i<D;i++)
		{
			scanf("%d",&a);
			tar[a]=1;
		}
		for(int i=0;i<S;i++)
		{
			spfa(si[i]);
		}
		printf("%d\n",ans);
	}
	return 0;
}


 

posted @ 2013-10-22 19:20  amourjun  阅读(113)  评论(0编辑  收藏  举报