/*
*State: HDU1599    46MS    340K    1460 B    C++
*题目大意:
*        杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条
*        旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1
*        ,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过
*        2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮
*        他找一条这样的路线,并且花费越少越好。
*解题思路:
*        巧妙利用floyd找最小环即可。注意中间的溢出问题。
*/
View Code
#include <iostream>
#include <cstdio>
using namespace std;

const int inf = 0x3f3f3f3f;
const int MAXN = 105;
int dis[MAXN][MAXN], g[MAXN][MAXN];

void init()
{
    for(int i = 0; i < MAXN; i++)
        for(int j = 0; j < MAXN; j++)
        {
            if(i == j)
                dis[i][j] = g[i][j] = 0;
            else
                dis[i][j] = g[i][j] = inf;
        }
}

int floyd(int n)
{
    int Min = inf;
    for(int k = 1; k <= n; k++)
    {
        for(int i = 1; i < k; i++)
        {
            if(g[i][k] == inf)
                continue;
            for(int j = i + 1; j < k; j++)
            {
                if(dis[i][j] != inf && g[k][j] != inf
                    && dis[i][j] + g[i][k] + g[k][j] < Min)
                {
                    Min = dis[i][j] + g[i][k] + g[k][j];
                }
            }
        }
        for(int i = 1; i <= n; i++)
        {
            if(dis[i][k] == inf)
                continue;
            for(int j = 1; j <= n; j++)
            {
                if(dis[k][j] != inf && dis[i][j] > dis[i][k] + dis[k][j])
                    dis[i][j] = dis[i][k] + dis[k][j];
            }
        }
    }
    return Min;
}

int main(void)
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
    //printf("%d\n%d\n", inf, inf + inf);
    //printf("%d\n", 0x7fffffff);
    int n, m;
    while(scanf("%d %d", &n, &m) == 2)
    {
        int u, v, w;
        init();
        for(int i = 0; i < m; i++)
        {
            scanf("%d %d %d", &u, &v, &w);
            if(dis[u][v] > w)
            {
                dis[u][v] = dis[v][u] = w;
                g[u][v] = g[v][u] = w;
            }
        }
        int Min = floyd(n);
        if(Min >= inf)
            printf("It's impossible.\n");
        else
            printf("%d\n", Min);
    }
    return 0;
}
posted on 2012-09-02 15:39  cchun  阅读(208)  评论(0编辑  收藏  举报