HDU2066:一个人的旅行(Dijkstra 多源点,多汇点最短路)
题意:给你若干个起点和终点,让你求最短路
思路:可以取任意一个起点做出发点,其他起点到它的距离为 0 ,然后做一次 Djikstra ,找出合法的最短路就行了
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[1005][1005],d[3010],z[1005],y[1005];
bool v[3010];
int M,Z,Y,n;
void dj()
{
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
for(int i=1;i<=Z;i++)
d[z[i]]=0;//所有起点到初始点距离为0
for(int i=1;i<n;i++)
{
int x=0;
for(int j=1;j<=n;j++)
{
if(!v[j]&&(x==0||d[j]<d[x]))
x=j;
}
v[x]=1;
for(int y=1;y<=n;y++)
d[y]=min(d[y],d[x]+a[x][y]);
}
}
int main()
{
while(~scanf("%d%d%d",&M,&Z,&Y))
{
memset(a,0x3f,sizeof(a));
for(int i=1;i<=1005;i++)
a[i][i]=0;
for(int i=1;i<=M;i++)
{
int c,b,w;
scanf("%d%d%d",&c,&b,&w);
a[c][b]=a[b][c]=min(a[c][b],w);
n=max(n,max(c,b));//找出有多少个点
}
for(int i=1;i<=Z;i++)
{
scanf("%d",&z[i]);
a[z[1]][z[i]]=0;
}
for(int i=1;i<=Y;i++)
{
scanf("%d",&y[i]);
}
dj();
int dis=999999999;
for(int i=1;i<=Y;i++)
{
dis=min(dis,d[y[i]]);
}
printf("%d\n",dis);
}
return 0;
}
戒骄戒躁,百炼成钢!