首页 > 代码库 > CodeForces 745C Hongcow Builds A Nation 并查集
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_element54 55 *mx+=rest;//把剩下的点放到最大的连通块中56 int sum=0;57 for(auto i:num)58 {59 sum+=i*(i-1)/2;60 }61 printf("%d\n",sum-m);62 return 0;63 }/*64 65 3 3 166 267 1 268 1 369 2 370 71 */
CodeForces 745C Hongcow Builds A Nation 并查集
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。