Codeforces Round #385 (Div. 2) C

来源:互联网 发布:域名如何icp备案 编辑:程序博客网 时间:2024/06/03 21:30

思路如下:

先找联通块

没有特殊点的联通块加起来与在有特殊点中点最多的联通块 这样最多有c2n 即n*(n-1)/2;

剩下的特殊联通块自己加边

代码如下

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=1005;vector<int>group[maxn];int f[maxn],c[maxn];int Find(int x){if(f[x]==x)return x;return f[x]=Find(f[x]);}void unite(int u,int v){int xx=Find(u);int yy=Find(v);if(xx!=yy) f[xx]=yy;}int main(){int n,m,k,u,v; scanf("%d %d %d",&n,&m,&k);for(int i=0;i<k;i++)scanf("%d",&c[i]);for(int i=1;i<=n;i++)f[i]=i;for(int i=0;i<m;i++){int u,v;scanf("%d %d",&u,&v);unite(u,v);} int sum1=0,sum=0,ma=0;for(int i=0;i<maxn;i++)group[i].clear();for(int i=1;i<=n;i++)group[Find(i)].push_back(i);for(int i=0;i<k;i++){int temp=Find(c[i]);int num=group[temp].size();ma=max(num,ma);sum1+=num; sum+=(num*(num-1))/2;}sum1=n-sum1;sum1+=ma;sum+=(sum1*(sum1-1))/2;sum-=(ma*(ma-1))/2;sum-=m;printf("%d\n",sum);} 


原创粉丝点击