zoukankan      html  css  js  c++  java
  • find the mincost route【无向图最小环】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1599

    Problem Description
    杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮他找一条这样的路线,并且花费越少越好。
    Input
    第一行是2个整数N和M(N <= 100, M <= 1000),代表景区的个数和道路的条数。
    接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。
    Output
    对于每个测试实例,如果能找到这样一条路线的话,输出花费的最小值。如果找不到的话,输出"It's impossible.".
    Sample Input
    3 3
    1 2 1
    2 3 1
    1 3 1
    3 3
    1 2 1
    1 2 3
    2 3 1
    Sample Output
    3
    It's impossible.
    题目大意:给一张n个点,m条无向边的图,求图中最小环长度。
    解题思路:
    1.floyd最小环模板
    2.注意inf为0x3f3f3f3f时,三个inf相加会爆int ,所以数组我们开long long型
    代码如下:
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #define LL long long
     4 #define mem(a, b) memset(a, b, sizeof(a))
     5 using namespace std;
     6 const LL inf = 0x3f3f3f3f;
     7 const int MAXN = 110;
     8 
     9 int n, m;
    10 LL dis[MAXN][MAXN], map[MAXN][MAXN];//最短路径 直接路径 
    11 LL ans;
    12 
    13 void floyd()
    14 {
    15     ans = inf;
    16     for(int k = 1; k <= n; k ++) //枚举中点 
    17     {
    18         for(int i = 1; i < k; i ++) //起点 
    19             for(int j = i + 1; j < k; j ++)//终点 
    20                 ans = min(ans, map[i][k] + map[k][j] + dis[i][j]); //在dis没更新倒k之前,是没有经过k点的。所以保证了至少3个不同的点 
    21         for(int i = 1; i <= n; i ++)
    22             for(int j = 1; j <= n; j ++)
    23                 dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
    24     }
    25     if(ans != inf)
    26         printf("%lld
    ", ans);
    27     else
    28         printf("It's impossible.
    ");
    29 }
    30 
    31 int main()
    32 {
    33     while(scanf("%d%d", &n, &m) != EOF)
    34     {
    35         for(int i = 1; i <= n; i ++)
    36             for(int j = 1; j <= n; j ++)
    37             {
    38                 if(i == j)
    39                     dis[i][j] = map[i][j] = 0;
    40                 else
    41                     dis[i][j] = map[i][j] = inf;
    42             }
    43         for(int i = 1; i <= m; i ++)
    44         {
    45             int a, b;
    46             LL c;
    47             scanf("%d%d%lld", &a, &b, &c);
    48             dis[a][b] = dis[b][a] = map[a][b] = map[b][a] = min(map[a][b], c);//双向边 
    49         }
    50         floyd();
    51     }
    52     return 0;
    53 }
    View Code

     对于有向图的最小环:不同之处在于1.建图(不用说了吧 有向图的建图)2. ans = min(ans, map[i][k] + map[k][j] + dis[j][i]);

  • 相关阅读:
    Security headers quick reference Learn more about headers that can keep your site safe and quickly look up the most important details.
    Missing dollar riddle
    Where Did the Other Dollar Go, Jeff?
    proteus 与 keil 联调
    cisco router nat
    router dhcp and dns listen
    配置802.1x在交换机的端口验证设置
    ASAv931安装&初始化及ASDM管理
    S5700与Cisco ACS做802.1x认证
    playwright
  • 原文地址:https://www.cnblogs.com/yuanweidao/p/11517084.html
Copyright © 2011-2022 走看看