您的位置:首页 > 其它

Codeforces Round #385 (Div. 2) C

2017-08-05 21:59 127 查看
思路如下:

先找联通块

没有特殊点的联通块加起来与在有特殊点中点最多的联通块 这样最多有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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: