标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2014 Accepted Submission(s): 785
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 100010; 4 int uf[maxn],d[maxn],odd[maxn]; 5 bool vis[maxn]; 6 int Find(int x){ 7 if(x != uf[x]) uf[x] = Find(uf[x]); 8 return uf[x]; 9 } 10 vector<int>root; 11 int main(){ 12 int n,m,u,v; 13 while(~scanf("%d%d",&n,&m)){ 14 for(int i = 0; i < maxn; ++i){ 15 uf[i] = i; 16 odd[i] = d[i] = 0; 17 vis[i] = false; 18 } 19 root.clear(); 20 for(int i = 0; i < m; ++i){ 21 scanf("%d%d",&u,&v); 22 ++d[u]; 23 ++d[v]; 24 u = Find(u); 25 v = Find(v); 26 if(u != v) uf[v] = u; 27 } 28 for(int i = 1; i <= n; ++i){ 29 u = Find(i); 30 if(!vis[u]){ 31 vis[u] = true; 32 root.push_back(u); 33 } 34 if(d[i]&1) ++odd[u]; 35 } 36 int ret = 0; 37 for(int i = 0; i < root.size(); ++i){ 38 if(!d[root[i]]) continue; 39 if(odd[root[i]] == 0) ret++; 40 else ret += odd[root[i]]/2; 41 } 42 printf("%d\n",ret); 43 } 44 return 0; 45 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4716248.html