HDU-1599-Find the mincost route

无语了,第一次因为溢出错这么多次。最大值不能设置为0x3f3f3f3f ,要不然三个它相加就溢出了,一直错。
这题问的是从一个点出发,经过其它不同两点,回到起点,这个环的最小值,也就是说边ab+bc+ca的值。
我们可以不断地进行松弛操作,每次调整最小的环值,我们比较的是,当前最小环值和从 min(ac)+dis(ab)+dis(bc) ,这样我们就一定经过了不同的两点,从而更新了环值。
默默补一句,不知初始毁一生,越界溢出也毁一生。。。

#include <cstdio>
#include <cstring>
const int INF = 1000000;
int map[105][105];
int dis[105][105];
int n, m, minc;

int min(int x,int y)
{
    return x < y ? x : y;
}

void floyd()
{
    minc = INF;
    for (int k = 1; k <= n;k++) {
        for (int i = 1; i <= k;i++) {
            for (int j = i + 1; j <= k;j++) {
                minc = min(minc, dis[i][j] + map[i][k] + map[k][j]);
            }
        }
        for (int i = 1; i <= n;i++) {
            for (int j = 1; j <= n;j++) {
                dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
            }
        }
    }
}

int main()
{
    while (scanf("%d%d",&n,&m)!=EOF) {
        for (int i = 0; i <= n;i++) {
            for (int j = 0; j <= n;j++) {
                map[i][j] = INF;
                dis[i][j] = INF;
            }
        }
        int s, e, c;
        for (int i = 1; i <= m;i++) {
            scanf("%d%d%d", &s, &e, &c);
            if (c<map[s][e]) {
                map[s][e] = c;
                map[e][s] = c;
                dis[s][e] = c;
                dis[e][s] = c;
            }
        }
        floyd();
        if (minc<INF)
            printf("%d\n", minc);
        else
            printf("It's impossible.\n");
    }
    return 0;
}
posted @ 2019-02-05 18:34  xyee  阅读(167)  评论(0编辑  收藏  举报