我用的是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;
}

 

posted on 2012-08-26 21:14  有间博客  阅读(166)  评论(0编辑  收藏  举报