HDU1232

发现看起来是个mst其实用不着。

结论比较显然,统计哪些点没有边相连,那么这些点只需连一条边接入某个至少有两个点的森林。不要忘记森林之间需要边相连,如有x个森林就需要x-1条边。

所以最后答案就是没有边相连的点个数+至少有两个点的森林个数-1。

 1 #include<iostream>
 2 #include<unordered_map>
 3 using namespace std;
 4 int n,m,ans,f[1001],u,v,cnt;
 5 unordered_map<int,int> mp,mp1; //mp1将已有边的点去重 
 6 
 7 void ini(){
 8     ans=cnt=0;
 9     mp.clear();
10     mp1.clear(); 
11     for (int i=1;i<=n;i++) f[i]=i;
12 }
13 
14 int getf(int u){
15     return f[u]==u?f[u]:f[u]=getf(f[u]);
16 }
17 
18 void merge(int u,int v){
19     f[getf(u)]=getf(v);
20 }
21 
22 int main()
23 {
24     while (cin>>n){
25         if (n==0) break;
26         ini();
27         cin>>m;
28         while (m--){
29             cin>>u>>v;
30             merge(u,v);
31             if (!mp1[u]) mp1[u]=1,cnt++;
32             if (!mp1[v]) mp1[v]=1,cnt++;
33         }
34         for (int i=1;i<=n;i++){
35             if (!mp[getf(i)]++ && mp1[i]) ans++;
36         }
37         cout<<n-cnt+ans-1<<endl; 
38     }
39     return 0;    
40 }

 

posted @ 2020-04-29 16:01  White_Li  阅读(80)  评论(0)    收藏  举报