Hdu 1874 畅通工程续

我用的是Floyd算法求所有定点的最短边,这道题需要判重,由于我对于图论没啥经验,WA了N次。似乎判断d[i][j] + d[k][j]是否溢出的判断条件有小错误额。

CODE:

#include <stdio.h>
#include <stdlib.h>
#include < string.h>
using  namespace std;

const  int SIZE =  1010;
const  int INF =  0x3fffffff;
int d[SIZE][SIZE];
int n, m;

void Floyd()
{
     int i, j, k;
     for(k =  0; k < n; k++)
     for(i =  0; i < n; i++)
         for(j =  0; j < n; j++)
          if(d[i][j] <= INF && d[k][j] <= INF)     // 有小错误? 如果改为 <INF则会WA
             d[i][j] <?= d[i][k] + d[k][j];
}

void init()
{
     for( int i =  0; i < SIZE ; i++)
    {
         for( int j =  0; j < SIZE; j++)
        {
            d[i][j] = (i == j?  0: INF);  // 初始化 
        }
    }
     return ;
}

int main()
{
     int i, j;
     int u, v, w1;
     while(~scanf( " %d ", &n))
    {
        init();
         for(scanf( " %d ", &m); m >  0; m--)
        {
            scanf( " %d%d%d ", &u, &v, &w1);
             if(w1 < d[u][v])                 // 判重边,这里挺重要,2道题WA N次都是因为它。 
                d[u][v] = d[v][u] = w1;
        }
        Floyd();
        scanf( " %d%d ", &u, &v);
        printf(d[u][v] == INF? " -1\n ": " %d\n ", d[u][v]);
    }
     return  0;
}

 

你可能感兴趣的:(HDU)