hdu6380(2018 “百度之星”程序设计大赛 - 初赛(B))
degree
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 239????Accepted Submission(s): 150
Problem Description
度度熊最近似乎在研究圖論。給定一個(gè)有?N?個(gè)點(diǎn) (vertex) 以及?M?條邊 (edge) 的無向簡單圖 (undirected simple graph),此圖中保證沒有任何圈 (cycle) 存在。
現(xiàn)在你可以對此圖依序進(jìn)行以下的操作:
1. 移除至多?K?條邊。
2. 在保持此圖是沒有圈的無向簡單圖的條件下,自由的添加邊至此圖中。
請問最后此圖中度數(shù) (degree) 最大的點(diǎn)的度數(shù)可以多大呢?
Input
輸入的第一行有一個(gè)正整數(shù)?T,代表接下來有幾筆測試資料。
對于每筆測試資料:
第一行有三個(gè)整數(shù)?N,?M,?K。
接下來的?M?行每行有兩個(gè)整數(shù)?a?及?b,代表點(diǎn)?a?及?b?之間有一條邊。
點(diǎn)的編號由?0?開始至?N?1。
*?0≤K≤M≤2×105
*?1≤N≤2×105
*?0≤a,b<N
* 給定的圖保證是沒有圈的簡單圖
*?1≤T≤23
* 至多?2?筆測試資料中的?N>1000
Output
對于每一筆測試資料,請依序各自在一行內(nèi)輸出一個(gè)整數(shù),代表按照規(guī)定操作后可能出現(xiàn)的最大度數(shù)。
Sample Input
2
3 1 1
1 2
8 6 0
1 2
3 1
5 6
4 1
6 4
7 0
Sample Output
2
4
Source
2018 “百度之星”程序設(shè)計(jì)大賽 - 初賽(B)
解析:記錄度數(shù)最大的點(diǎn),把不相通的兩個(gè)集合分別用并查集,要是多余1個(gè)集合,說明可以增加邊(集合數(shù)-1)條邊。刪邊則根據(jù)k的大小,可以適當(dāng)?shù)脑黾舆叀?/span>
?
#include<bits/stdc++.h> using namespace std;#define e exp(1) #define pi acos(-1) #define mod 1000000007 #define inf 0x3f3f3f3f #define ll long long #define ull unsigned long long #define mem(a,b) memset(a,b,sizeof(a)) int gcd(int a,int b){return b?gcd(b,a%b):a;}const int maxn=200005; int f[maxn],d[maxn]; int Find(int x) {int r = x;while (f[r] != r)r = f[r];int i = x, j;while (i != r)//壓縮路徑 {j = f[i];f[i] = r;i = j;}return r; } int main() {int T;scanf("%d",&T);while(T--){int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i=0; i<n; i++)f[i]=i,d[i]=0;int ans=0,cnt=0;for(int i=0; i<m; i++){int x,y;scanf("%d%d",&x,&y);d[x]++;d[y]++;ans=max(max(ans,d[x]),d[y]);int xx=Find(x);int yy=Find(y);if(xx!=yy){f[xx]=yy;}}for(int i=0; i<n; i++){if(f[i]==i)cnt++;}int sum=ans+(cnt-1);int ss=m-ans;if(k>ss)sum+=ss;else if(k<=ss)sum+=k;printf("%d\n",sum);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的hdu6380(2018 “百度之星”程序设计大赛 - 初赛(B))的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu6375(2018 “百度之星”程
- 下一篇: hdu6383(2018 “百度之星”程