zoukankan      html  css  js  c++  java
  • 还是畅通工程(MST)

    还是畅通工程
    Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Submit Status

    Description

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。 
     

    Input

    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 
    当N为0时,输入结束,该用例不被处理。 
     

    Output

    对每个测试用例,在1行里输出最小的公路总长度。 
     

    Sample Input

    3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
     

    Sample Output

    3 5

    Hint

    Hint  Huge input, scanf is recommended.
            
     
     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<string.h>
     4 #define maxn 0x3fff
     5 using namespace std;
     6 int d[110] , map[110][110] , v[110] ;//d[i]用来存放(i - 1) - th ~ i - th (point) 的权值 , v[i] 中0表示没选过 , 1表示选过
     7 int n , m ;
     8 
     9 int prim (int start )
    10 {
    11     int mm , x ;
    12     for (int i = 1 ; i <= n ; i++)
    13         d[i] = i == start ? 0 : maxn ; //给 起始点 和 非起始点 涂色
    14     for (int i = 1 ; i <= n ; i++) {
    15         mm = maxn ;
    16         for (int j = 1 ; j <= n ; j++) { //找出权值最小的边
    17             if ( !v[j] && d[j] < mm ) {
    18                 mm = d[j] ;
    19                 x = j ;
    20             }
    21         }
    22         v[x] = 1 ;
    23         for (int j = 1 ; j <= n ; j++ )  {
    24              if ( !v[j] && d[j] > map[x][j] && map[x][j] != maxn )
    25                 d[j] = map[x][j] ;
    26         }
    27     }
    28     int tmp = 0 ;
    29     for (int i = 1 ; i <= n ; i++)
    30         tmp += d[i] ;
    31     return tmp ;
    32 }
    33 
    34 int main ()
    35 {
    36    // freopen ("a.txt" , "r" , stdin ) ;
    37     int val ;
    38     int a , b ;
    39     int res ;
    40     while ( cin >> n , n) {
    41         m = n * (n - 1) >> 1 ;
    42         memset (map , 0x3f , sizeof(map) ) ;
    43         memset (v , 0 , sizeof(v) ) ;
    44          for(int i = 1 ; i <= m ; i++ )
    45         {
    46             scanf ("%d%d%d", &a , &b , &val );
    47             if( val < map[a][b] )
    48             {
    49                 map[a][b] = val;
    50                 map[b][a] = val;
    51             }
    52         }
    53         res = prim(1) ;
    54         cout << res << endl ;
    55     }
    56     return 0 ;
    57 }
    200 ms prim
     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 int fa[110] , n , m ;
     5 struct edge
     6 {
     7     int u , v , w ;
     8 }e[20000];
     9 
    10 int cmp (edge a , edge b)
    11 {
    12     return a.w < b.w ;
    13 }
    14 
    15 int find (int x)
    16 {
    17     return fa[x] == x ? x : find(fa[x]) ;
    18 }
    19 
    20 void kruskal ()
    21 {
    22     sort (e + 1 , e + m + 1 , cmp ) ;
    23     int ans = 0 , x , y ;
    24     for (int i = 1 ; i <= m ; i++ ) {
    25         x = find (e[i].u) ;
    26         y = find (e[i].v) ;
    27         if ( x != y) {
    28             ans += e[i].w ;
    29             fa[x] = y ;
    30         }
    31     }
    32     printf ("%d
    " , ans ) ;
    33 }
    34 int main ()
    35 {
    36    // freopen ("a.txt" , "r" , stdin ) ;
    37     while (~ scanf ("%d" , &n ) , n ) {
    38         for (int i = 1 ; i <= n ; i++)
    39             fa[i] = i ;
    40         m = n * (n - 1) >> 1 ;
    41         for (int i = 1 ; i <= m ; i++ ) {
    42             scanf ("%d%d%d" , &e[i].u , &e[i].v , &e[i].w ) ;
    43         }
    44         kruskal () ;
    45     }
    46     return 0 ;
    47 }
    kruskal
  • 相关阅读:
    AJAX---跨域相关概念
    AJAX---jQuery全局事件处理函数
    AJAX---load方法
    AJAX---jQuery 中的ajax回调事件
    AJAX---jQuery 中的ajax方法的基本使用
    AJAX---基本的封装
    AJAX---模板引擎的使用
    AJAX---扩展点
    AJAX---如何处理服务端响应的数据
    AJAX---响应数据格式
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4281900.html
Copyright © 2011-2022 走看看