2018 “百度之星”程序设计大赛 - 初赛(B)-1001 degree
程序员文章站
2022-07-03 18:15:31
...
思路:对于入度最多的点即边最多的点,首先找到边最多的点,ans=边数。然后利用并查集求出区域块的个数s,对于除自己所在的区域块可以直接连一条边,ans=ans+s-1,然后再连一个点的话就需要消一条边以防止有环,ans=ans+k,还需要判断其不能大于n-1.
Code :
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
const int MAX_N=200005;
int n,m,k,T;
int d[MAX_N];
int id[MAX_N];
int Find(int x)
{
if(id[x]!=x) id[x]=Find(id[x]);
return id[x];
}
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
memset(d,0,sizeof(d));
cin>>n>>m>>k;
for(int i=0;i<n;++i)
id[i]=i;
int u,v;
for(int i=0;i<m;++i)
{
cin>>u>>v;
id[Find(u)]=Find(v);
d[u]++; d[v]++;
}
int s=0;
for(int i=0;i<n;++i)
s=max(s,d[i]);
map<int,int> imap;
for(int i=0;i<n;++i)
imap[Find(id[i])]++;
s+=imap.size()-1;
s=min(n-1,s+k);
cout<<s<<endl;
}
return 0;
}
推荐阅读
-
HDU-2017"百度之星"程序设计大赛-初赛(B)-1001-Chess
-
2018 “百度之星”程序设计大赛 - 初赛(B)-1001 degree
-
HDU-2017"百度之星"程序设计大赛-初赛(B)-1002-Factory
-
1001 Discount (数学 / 优惠率) (2020年百度之星*程序设计大赛-初赛三)
-
2018 百度之星初赛B-1001 degree
-
1003. Covid (思维 / 小根堆)(2020年百度之星*程序设计大赛-初赛二)
-
2018 “百度之星”程序设计大赛 - 初赛(A)1002-度度熊学队列
-
2018百度之星程序设计大赛初赛B——1002hex
-
2020 年百度之星·程序设计大赛 - 初赛三 P1005 Chess (HDU 6787) dp
-
2020 年百度之星·程序设计大赛 - 初赛三 P1005 Chess (HDU 6787) dp