zoukankan      html  css  js  c++  java
  • hdu 1599 无向图最小环

    裸的无向图最小环,我们可以在Floyd的过程中求得。

    具体思想是:枚举环中的编号最大的顶点k,然后枚举和k相关联的两个顶点i和j(i和j都小于k),则该环的长度为:dist[i][j] + g[j][k] + g[k][i],循环到k的时候,dist[i][j]表示的是i到j的经过的顶点编号小于k的最短路,所以正确性很显然,由于i、j、k都不相同,所以环上至少是3个点。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 const int INF = 999999;
     7 const int N = 101;
     8 int dist[N][N];
     9 int g[N][N];
    10 int n, m, ans;
    11 
    12 void floyd()
    13 {
    14     for ( int i = 1; i <= n; i++ )
    15     {
    16         for ( int j = 1; j <= n; j++ )
    17         {
    18             dist[i][j] = g[i][j];
    19         }
    20         dist[i][i] = g[i][i] = 0;
    21     }
    22     ans = INF;
    23     for ( int k = 1; k <= n; k++ )
    24     {
    25         for ( int i = 1; i < k; i++ )
    26         {
    27             for ( int j = i + 1; j < k; j++ )
    28             {
    29                 int tmp = dist[i][j] + g[i][k] + g[k][j];
    30                 if ( tmp < ans ) ans = tmp;
    31             }
    32         }
    33         for ( int i = 1; i <= n; i++ )
    34         {
    35             for ( int j = 1; j <= n; j++ )
    36             {
    37                 int tmp = dist[i][k] + dist[k][j];
    38                 if ( tmp < dist[i][j] )
    39                 {
    40                     dist[i][j] = tmp;
    41                 }
    42             }
    43         }
    44     }
    45 }
    46 
    47 int main ()
    48 {
    49     while ( scanf("%d%d", &n, &m) != EOF )
    50     {
    51         for ( int i = 1; i <= n; i++ )
    52         {
    53             for ( int j = 1; j <= n; j++ )
    54             {
    55                 g[i][j] = INF;
    56             }
    57         }
    58         while ( m-- )
    59         {
    60             int a, b, c;
    61             scanf("%d%d%d", &a, &b, &c);
    62             if ( c < g[a][b] )
    63             {
    64                 g[a][b] = g[b][a] = c;
    65             }
    66         }
    67         floyd();
    68         if ( ans == INF )
    69         {
    70             printf("It's impossible.
    ");
    71         }
    72         else
    73         {
    74             printf("%d
    ", ans);
    75         }
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    学生信息录入系统
    作业11(增删改查listview)
    作业10(qq增删改查)
    作业9
    作业8
    作业7
    右键打开Windows Terminal
    axure 动态面板中滚动条
    TortoiseSVN服务端的配置与使用
    hfs使用小技巧
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4672513.html
Copyright © 2011-2022 走看看