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;
    }
  • 相关阅读:
    机器学习决策树
    Apriori算法实战福彩双色球
    机器学习Random Forest算法简介
    机器学习CART决策树
    基本算法求最大子数组和 及其变种
    【语言处理与Python】3.6规范化文本
    【语言处理与Python】3.3使用Unicode进行文字处理
    【语言处理与Python】3.2字符串:最底层的文本处理
    【语言处理与Python】4.1回到基础
    【语言处理与Python】3.7用正则表达式为文本分词
  • 原文地址:https://www.cnblogs.com/cchun/p/2667578.html
Copyright © 2011-2022 走看看