ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于一些简单的‘欧拉回路’问题

2021-05-05 22:01:14  阅读:147  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有