hdu 2066 一个人的旅行

最短路问题。果然好久不做都忘得差点儿相同了,跑一次Dijkstra算法把全部点的最短距离都跑出来

#include<iostream>
#include<cstring>
#define maxn 1005
#define inf 1<<30
using namespace std;
int t,s,d;
int mapp[maxn][maxn];
int w[maxn];
int visit[maxn];
int di[maxn];
void solve()
{
	memset(visit,0,sizeof(visit));
	fill(di,di+maxn,inf);
	di[0]=0;
	while(t--)
	{
		int v=-1;
		for(int i=0;i<maxn;i++)
		{
			if(!visit[i]&&(v==-1||di[i]<di[v])) v=i;
		}
		//cout<<s<<"~"<<v<<endl;
		visit[v]=1;
		for(int i=0;i<maxn;i++)
		{
			if(mapp[v][i]!=inf)
			{
				di[i]=min(di[i],di[v]+mapp[v][i]);
				//cout<<i<<"~"<<di[i]<<endl;
			}
		}	
	}
}
int main()
{
	while(cin>>t>>s>>d)
	{
		for(int i=0;i<maxn;i++)
		{
			for(int j=0;j<maxn;j++) mapp[i][j]=inf;
		}
		for(int i=0;i<t;i++)
		{
			int x,y,z;
			cin>>x>>y>>z;
			mapp[y][x]=mapp[x][y]=min(z,mapp[x][y]);
		}
		for(int i=0;i<s;i++)
		{
			int x;
			cin>>x;
			mapp[0][x]=mapp[x][0]=0;
		}
		for(int i=0;i<d;i++) cin>>w[i];
		solve();
		int re=inf;
		for(int i=0;i<d;i++)
		{
			re=min(re,di[w[i]]);
		}
		cout<<re<<endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/brucemengbm/p/6953013.html