标签:return int 回路 ++ 简单 find 欧拉
关于欧拉回路
若为有向图
每个点入度==出度
则存在欧拉回路
若为无向图
每个点所连边为偶数
则存在欧拉回路
看上去很好理解
但是在处理实际问题时
往往要用到并查集/map,和很棘手的操作
有几道题,推一下
[1](https://www.luogu.com.cn/problem/P1341)
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int n; 6 7 char s[5]; 8 int a[2001][2000]; 9 int f[1000001]; 10 int in[100001]; 11 int m; 12 13 int find(int k) 14 { 15 if(f[k]==k) 16 return k; 17 else 18 return f[k]=find(f[k]); 19 } 20 char ans[10001]; 21 22 void dfs(int x) 23 { 24 for(int i=64;i<=128;i++) 25 if(a[x][i]) 26 { 27 a[x][i]=a[i][x]=0; 28 dfs(i); 29 } 30 ans[m--]=x; 31 32 return ; 33 } 34 35 int tot,head; 36 37 int main() 38 { 39 ios::sync_with_stdio(false); 40 cin>>n; 41 m=n; 42 for(int i=64;i<=128;i++) 43 f[i]=i; 44 for(int i=1;i<=n;i++) 45 { 46 cin>>s; 47 a[s[0]][s[1]]=a[s[1]][s[0]]=1; 48 in[s[0]]++; 49 in[s[1]]++; 50 f[find(s[0])]=find(s[1]); 51 } 52 53 for(int i=64;i<=128;i++) 54 if(f[i]==i&&in[i]) 55 tot++; 56 57 if(tot!=1) 58 { 59 cout<<"No Solution"<<endl; 60 return 0; 61 } 62 tot=0; 63 for(int i=64;i<=128;i++) 64 { 65 if(in[i]&1) 66 { 67 tot++; 68 if(head==0) 69 head=i; 70 } 71 } 72 if(tot&&tot!=2) 73 { 74 cout<<"No Solution"<<endl; 75 return 0; 76 } 77 if(!head) 78 { 79 for(int i=64;i<=128;i++) 80 { 81 if(in[i]) 82 { 83 head=i; 84 break; 85 } 86 } 87 } 88 dfs(head); 89 cout<<ans; 90 91 return 0; 92 }
[2](https://www.luogu.com.cn/problem/P1333)
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 const int N=500020; 6 int n,ans; 7 int f[N],d[N]; 8 string a,b; 9 map < string , int >m; 10 11 int find(int k) 12 { 13 if(f[k]==k) 14 return k; 15 else 16 return f[k]=find(f[k]); 17 } 18 19 int get(string s) 20 { 21 if(m.find(s)==m.end()) 22 { 23 m[s]=n; 24 f[n]=n; 25 n++; 26 } 27 return m[s]; 28 } 29 30 int main() 31 { 32 ios::sync_with_stdio(false); 33 34 while((cin>>a>>b)) 35 { 36 int x=get(a),y=get(b); 37 d[x]++; 38 d[y]++; 39 f[find(x)]=find(y); 40 } 41 42 for(int i=0;i<n;i++) 43 { 44 if(find(i)!=find(1)) 45 { 46 cout<<"Impossible"; 47 return 0; 48 } 49 if(d[i]&1) 50 ans++; 51 52 } 53 if(ans==2||!ans) 54 cout<<"Possible"; 55 else 56 cout<<"Impossible"; 57 58 return 0; 59 }
标签:return,int,回路,++,简单,find,欧拉 来源: https://www.cnblogs.com/Hehe-0/p/14732951.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。