Hdu 2066 一个人的旅行

先试了试Floyd算法,结果没弄出来。然后试了试单源Dijsktra最短路径,两层循环找出最小的结果,建图的过程中遇到了小麻烦,有时间的话再写一写Floyd算法。

CODE:

 

#include <cstdio>
#include <cstdlib>
#include < string>
using  namespace std;

const  int SIZE =  1010;
const  int INF =  0x3fffffff;

int w[SIZE][SIZE];
int v[SIZE], d[SIZE];
int T, S, D, tot;
int link[SIZE], want[SIZE];

int max( int x,  int y)
{
     return  x > y ? x : y;
}


void Dijkstra( int src,  int n)
{
     int i, j;
    memset(v,  0sizeof(v));
     for(i =  1; i <= n; i++) d[i] = (i == src)?  0 : INF;
     for(i =  1; i <= n; i++)
    {
         int x, m = INF;
         for( int y =  1; y <= n; y++)  if(!v[y] && m >= d[y]) m = d[x=y];
        v[x] =  1;
         for( int y =  1; y <= n; y++) d[y] <?= d[x]+w[x][y];
    }
}


void init()
{
     for( int i =  1; i <= SIZE; i++)
    {
         for( int j =  1; j <= SIZE; j++)
        {
            w[i][j] = w[j][i] = INF;
        }
    }
    memset(d,  0sizeof(d));
    memset(link,  0sizeof(link));
    memset(want,  0sizeof(want));
}

int main()
{
     int i, j;
     while(~scanf( " %d%d%d ", &T, &S, &D))
    {
        init();
        tot =  0;
         for(i =  1; i <= T; i++)
        {
             int u, v, w1;
            scanf( " %d%d%d ", &u, &v, &w1);
             if(w1 < w[u][v])  // 判重边,不加这句话WA了N次。
            {
              w[u][v] = w[v][u] = w1;
            }
            tot >?= max(u, v);
        }
         for(i =  1; i <= S; i++)    scanf( " %d ", &link[i]);
         for(i =  1; i <= D; i++) scanf( " %d ", &want[i]);
         int ans = INF, min;
         for(i =  1; i <= S; i++)
        {
            Dijkstra(link[i], tot);
            min = INF;
             for(j =  1; j <= D; j++)
            {
                min <?= d[want[j]];
            }
            ans <?= min;
        }
        printf( " %d\n ", ans);
    }
     return  0;

 

你可能感兴趣的:(HDU)