• CodeForces 745C Hongcow Builds A Nation 并查集


    题意:

    给了你n个城市 m条边 k个政府

    每个政府管辖的区域内不能和其他政府的区域有相连

    即政府之间不存在路径

    问你在维护这种关系的同时

    最多再加多少条边

    思路:

    先找出来每个联通块

    再找出来没有归属的孤立的点

    把他们都放到最大的联通块里

    然后每个联通块之间的点两两连边是n*(n-1)/2条边

    最后算出来的ans-m就好了

    (看别人的博客学了一个max_element

     1 #include<bits/stdc++.h>
     2 #define cl(a,b) memset(a,b,sizeof(a))
     3 #define debug(a) cerr<<#a<<"=="<<a<<endl
     4 using namespace std;
     5 typedef long long ll;
     6 typedef pair<int,int> pii;
     7 
     8 const int maxn=1e5+10;
     9 
    10 int fa[maxn];
    11 
    12 int fd(int i)
    13 {//并查集
    14     if(fa[i]==0) return i;
    15     else return fa[i]=fd(fa[i]);
    16 }
    17 
    18 int main()
    19 {
    20     int n,m,k;
    21     scanf("%d%d%d",&n,&m,&k);
    22     vector<int>vis(n+1,0);
    23     vector<int>gov(k,0),num(k,0);
    24     for(int i=0;i<k;i++)
    25     {
    26         scanf("%d",&gov[i]);
    27     }
    28     for(int i=0;i<m;i++)
    29     {
    30         int x,y;
    31         scanf("%d%d",&x,&y);
    32         int fx=fd(x),fy=fd(y);
    33         if(fx!=fy)
    34         {//如果不相连的话 把两个点相连
    35             fa[fx]=fy;
    36         }
    37 
    38     }
    39     for(int i=1;i<=n;i++)
    40     {//寻找每个节点所在联通块的大小
    41         vis[fd(i)]++;
    42     }
    43     int rest=n;//初始化所有的点都剩下了
    44     for(int i=0;i<k;i++)
    45     {//将每个政府所在联通块大小进行记录
    46         num[i]=vis[fd(gov[i])];
    47         rest-=num[i];//减去已经记录过的点
    48     }
    49     //剩下的rest就是孤立的点的个数
    50 
    51     ///新姿势 找出最大的联通块
    52     auto mx=max_element(num.begin(),num.end());
    53     ///max_element类似于kdtree模板中的nth_element
    54 
    55     *mx+=rest;//把剩下的点放到最大的连通块中
    56     int sum=0;
    57     for(auto i:num)
    58     {
    59         sum+=i*(i-1)/2;
    60     }
    61     printf("%d
    ",sum-m);
    62     return 0;
    63 }/*
    64 
    65 3 3 1
    66 2
    67 1 2
    68 1 3
    69 2 3
    70 
    71 */
  • 相关阅读:
    SQL进阶系列之2自连接
    SQL进阶系列之0窗口函数
    SQL进阶系列之1CASE表达式
    Python for Email
    数据分析的统计基础5
    利用Python openpyxl操作Excel
    SQL基础篇(MICK)
    数据分析的统计基础4
    数据分析的统计基础3
    数据分析的统计基础2
  • 原文地址:https://www.cnblogs.com/general10/p/7203137.html
Copyright © 2020-2023  润新知