zoukankan      html  css  js  c++  java
  • 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
    ",dis);
        }
    return 0;
    }
    
    
    戒骄戒躁,百炼成钢!
  • 相关阅读:
    2. text()方法
    【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十五):神经网络笔记2(下)
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
  • 原文地址:https://www.cnblogs.com/Pecoz/p/12622661.html
Copyright © 2011-2022 走看看