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

关于欧拉回路

若为有向图

每个点入度==出度

则存在欧拉回路

若为无向图

每个点所连边为偶数

则存在欧拉回路

看上去很好理解

但是在处理实际问题时

往往要用到并查集/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 }

 

posted @ 2021-05-05 22:00  Hehe_0  阅读(93)  评论(0)    收藏  举报