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 }

浙公网安备 33010602011771号