zoukankan      html  css  js  c++  java
  • POJ-1861 Network---最小生成树

    题目链接:

    https://vjudge.net/problem/POJ-1861

    题目大意:

    有一些公司,公司之间需要连接起来。给出了哪些公司可以连接以及连接边的长度。求最小生成树中最大的边,以及最小生成树的边数,以及输出一颗可行的最小生成树。

    思路:

    裸的kruskal

    这里要求输出的是最大边和边数,不是权值,而且样例是错误的

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #include<stack>
     8 #include<map>
     9 #include<sstream>
    10 using namespace std;
    11 typedef long long ll;
    12 const int maxn = 1e5 + 10;
    13 const int INF = 1 << 30;
    14 int dir[4][2] = {1,0,0,1,-1,0,0,-1};
    15 int T, n, m;
    16 struct edge
    17 {
    18     int u, v, w;
    19     bool operator <(const edge& a)const
    20     {
    21         return w < a.w;
    22     }
    23 };
    24 edge a[maxn], ans[1010];
    25 int tot, maxx;
    26 int par[1010], high[1010];
    27 //初始化n个元素
    28 void init(int n)
    29 {
    30     for(int i = 0; i < n; i++)
    31     {
    32         par[i] = i;
    33         high[i] = 0;
    34     }
    35 }
    36 //查询树的根
    37 int Find(int x)
    38 {
    39     return par[x] == x ? x : par[x] = Find(par[x]);//路径压缩
    40 }
    41 void unite(int x, int y)
    42 {
    43     x = Find(x);
    44     y = Find(y);
    45     if(x == y)return;
    46     if(high[x] < high[y])par[x] = y;//y的高度高,将x的父节点设置成y
    47     else
    48     {
    49         par[y] = x;
    50         if(high[x] == high[y])high[x]++;
    51     }
    52 }
    53 bool same(int x, int y)
    54 {
    55     return Find(x) == Find(y);
    56 }
    57 int kruskal(int n, int m)//点数n,边数m
    58 {
    59     int sum_mst = 0;//mst权值
    60     int num= 0;//已经选择的边的边数
    61     sort(a, a + m);//边进行排序
    62     init(n);//初始化并查集
    63     for(int i = 0; i < m; i++)
    64     {
    65         int u = a[i].u;
    66         int v = a[i].v;
    67         if(Find(u - 1) != Find(v - 1))//图最开始的下标是1,并查集是0
    68         {
    69             //printf("%d %d %d
    ", u, v, a[i].w);
    70             ans[tot++] = a[i];
    71             maxx = max(maxx, a[i].w);
    72             sum_mst++;
    73             num++;
    74             unite(u - 1, v - 1);
    75         }
    76         if(num >= n - 1)break;
    77     }
    78     return sum_mst;
    79     //printf("weight of mst is %d
    ", sum_mst);
    80 }
    81 int main()
    82 {
    83     while(cin >> n >> m)
    84     {
    85         tot = maxx = 0;
    86         for(int i = 0; i < m; i++)
    87         {
    88             scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
    89         }
    90         int sum = kruskal(n, m);
    91         cout<<maxx<<endl;
    92         cout<<sum<<endl;
    93         for(int i = 0; i < tot; i++)
    94             cout<<ans[i].u<<" "<<ans[i].v<<endl;
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    RabbitMQ + topic发送消息+python
    maven下载依赖jar包失败处理方法--下载jar包到本地并安装到maven仓库中
    Jmeter--thrift接口压测
    将jar文件加到maven的local repository中
    在Mac机器上给ITerm2配置lrzsz,便捷的传输文件到远程服务器上
    linux iptables 开启和关闭服务端口号
    centos 安装PGSQL
    pgsql 常用的命令
    web压力测试工具
    centos安装 mysql
  • 原文地址:https://www.cnblogs.com/fzl194/p/8724555.html
Copyright © 2011-2022 走看看