Codeforces Round #385 (Div. 2) C
2017-08-05 21:59
127 查看
思路如下:
先找联通块
没有特殊点的联通块加起来与在有特殊点中点最多的联通块 这样最多有c2n 即n*(n-1)/2;
剩下的特殊联通块自己加边
代码如下
先找联通块
没有特殊点的联通块加起来与在有特殊点中点最多的联通块 这样最多有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); }
相关文章推荐
- Codeforces Round #385 (Div. 2)C. Hongcow Builds A Nation【并查集+贪心】好题~
- Codeforces Round #390 (Div. 2) D. Fedor and coupons
- Codeforces Round #280 (Div. 2)
- Codeforces Round #416 (Div. 2) B. Vladik and Complicated Book
- Educational Codeforces Round 37 (Rated for Div. 2)【A B C】【水】【模拟】
- Codeforces Round #277.5 (Div. 2) D
- Codeforces Round #141 (Div. 2) A题
- codeforces Round 377 Div2 E
- Codeforces Round #377 (Div. 2) D 二分
- Codeforces Round 340 (Div 2)D Polyline 【枚举】【思维】
- Codeforces Round #281 (Div. 2) C. Vasya and Basketball
- Codeforces Round #286 (Div. 2) C
- Codeforces Round #429 (Div. 2) | A. Generous Kefa
- Codeforces Round #343 (Div. 2)
- Codeforces Round #429 (Div. 2) ABC
- Codeforces Round #310 (Div. 2) B. Case of Fake Numbers 水题
- Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister
- Codeforces Round #274 (Div. 1)——C. Riding in a Lift
- Codeforces Beta Round #87 (Div. 2 Only) A题
- Codeforces Round #134 (Div. 2) 并查集