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;
}

posted @ 2020-04-02 20:07  Pecoz  阅读(195)  评论(0编辑  收藏  举报