zoukankan      html  css  js  c++  java
  • ZOJ1542 POJ1861

    题意:给你N个点M条边,求最小生成树,并且输出最小生成树里最大的那条边,并且输出路径 

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 #define N 1005
     9 #define M 15005
    10 int father[N],rank[N],n,m,sum,MAX,num;
    11 int NUM[N];
    12 struct Edge
    13 {
    14     int u;
    15     int v;
    16     int w;
    17 }edge[M];
    18 
    19 bool cmp(Edge a,Edge b)
    20 {
    21     return a.w < b.w ;
    22 }
    23 
    24 void Init()
    25 {
    26     for(int i=0; i<=n; i++)
    27     {
    28         father[i] = i;
    29         rank[i] = 1;
    30     }
    31 }
    32 
    33 int find(int x)
    34 {
    35     if(father[x] != x)
    36     {
    37         father[x] = find(father[x]);
    38     }
    39     return father[x] ;
    40 }
    41 
    42 void merge(int x,int y)
    43 {
    44     int xf = find(x);
    45     int yf = find(y);
    46     if(rank[xf] > rank[yf])
    47     {
    48         rank[xf] += rank[yf];
    49         father[yf] = xf;
    50     }
    51     else
    52     {
    53         rank[yf] += rank[xf];
    54         father[xf] = yf;
    55     }
    56 }
    57 
    58 void Kruskal()
    59 {
    60     num = 0; 
    61     MAX=0;
    62     for(int i=0; i<m; i++)
    63     {
    64         int u = edge[i].u;
    65         int v = edge[i].v;
    66         if(find(u) != find(v))
    67         {
    68             NUM[num] = i;
    69             num++ ;
    70             sum += edge[i].w;
    71             MAX = max(MAX,edge[i].w);
    72             merge(u,v);
    73         }
    74         if(num == n-1) break;
    75     }
    76 }
    77 
    78 int main()
    79 {
    80     while(scanf("%d%d",&n,&m)!=EOF)
    81     {
    82         Init();
    83         for(int i=0; i<m; i++)
    84         {
    85             scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
    86         }
    87         sort(edge,edge+m,cmp);
    88         sum = 0;
    89         Kruskal();
    90         printf("%d
    ",MAX);
    91         printf("%d
    ",num);
    92         for(int i=0; i<num; i++)
    93         {
    94             printf("%d %d
    ",edge[NUM[i]].u,edge[NUM[i]].v);
    95         }
    96     }
    97     return 0;
    98 } 
    View Code
  • 相关阅读:
    oo第四次博客
    oo第三次博客
    oo第二次博客
    oo第一次博客
    OO第四次博客
    OO第三次博客总结
    第二次博客总结
    oo第一次博客总结
    oo第四次博客作业
    oo第三次博客作业
  • 原文地址:https://www.cnblogs.com/ar940507/p/3222987.html
Copyright © 2011-2022 走看看