ACM-最短路 hdu 2066(一个人的旅行)

题目链接

题目大意:中文题就不必多说了。

思路;起点的城市记为0,所有跟起点相邻的城市到起点距离都为0,即在z[0][相邻城市]=0;

AC代码;

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#define MAX 1<<30;
using namespace std;
int a,b,c,l,m,n,x,h,e;
int z[1111][1111];
int d[1111],biao[1111],y[1111],v[1111];
void Dijkstra()    //最短路的模板
{
    int i,j,h,p,q;
    memset(biao,0,sizeof(biao));
    for(i=0;i<=x;i++)
    {
        d[i]=z[0][i];
    }
    biao[0]=1;
    for(i=1;i<=x;i++)
    {
        q=MAX;
        for(j=1;j<=x;j++)
        {
            if(!biao[j]&&d[j]<q)
            {
                q=d[j];
                p=j;
            }
        }
            biao[p]=1;
            for(h=1;h<=x;h++)
            {
                if(!biao[h]&&d[h]>d[p]+z[p][h])
                {
                    d[h]=d[p]+z[p][h];
                }
            }
        }
    }
}
int main()
{
    while(~scanf("%d %d %d",&a,&b,&c))
    {
        x=0;   //x为标号最大的城市
        for(int i = 0; i<1111; i++)
        {
            for(int j = 0; j<1111; j++)
                z[i][j]=MAX;
            z[i][i] = 0;
        }
         while(a--)
         {
             scanf("%d %d %d",&l,&m,&n);
             x=max(max(l,m),x);
             if(z[l][m]>n)        //z[l][m]存入的就是两个城市之间最短的路
             {
                  z[l][m]=z[m][l]=n;
             }
         }
         for(int j=0;j<b;j++)      //初始所有与起点相邻城市的距离
         {
             scanf("%d",&e);
             z[0][e]=z[e][0]=0;     
         }
         int f=MAX;
         for(int j=0;j<c;j++)    //所有想到达的城市的标号用数组存起来。
         {
             scanf("%d",&v[j]);
         }
         Dijkstra();  //找出从起点到各个能到达城市的最短路
         for(int j=0;j<c;j++)       //将所有想到达城市的最短路比较一下,求出最短的。
         {
               f=min(d[v[j]],f);
         }
         printf("%d\n",f);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/soul778888/article/details/80335393