zoukankan      html  css  js  c++  java
  • HDU1599 find the mincost route 最小环

    /*
    *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;
    }
  • 相关阅读:
    poj 1466 Girls and Boys (最大独立集)
    hdu 3667 Transportation (拆边 ,最小费用流)
    poj 3487 The Stable Marriage Problem (稳定婚姻 GaleShapley算法 )
    ZOJ Problem Set 1239 (最小点覆盖 )
    poj 2060 Taxi Cab Scheme (最小路径覆盖)
    poj 2226 Muddy Fields (最小点覆盖)
    hdu 1281 棋盘游戏 (二分图)
    hdu 3666 THE MATRIX PROBLEM (差分约束)
    poj 1325 Machine Schedule (最小点覆盖)
    ORACLE导入导出
  • 原文地址:https://www.cnblogs.com/cchun/p/2667578.html
Copyright © 2011-2022 走看看