luogu 1314 欧拉回路
欧拉路径:一笔画的路径
欧拉回路:一笔画的回路
两者判断方法一样但是输出略有不同。并且还有Fleury(弗罗莱)算法,但是我不会。.
这里就用dfs就好
判断条件:
1)图的连通性(可用并查集判断)
2)无向/有向的路径/回路拥有的特性
思路:1)寻找连边,有的话继续深搜
2)无连边的话,入栈/输出
回路 路径 备注
无向 度全偶 全偶/两奇余偶 同/反皆可,一般反
有向 入=出(0) 1,-1,0 输出与dfs序同
有向图需要入栈并且dfs后逆序输出
e.g.:luogu 1314 无序字母对
#include<bits/stdc++.h> using namespace std; const int N=605; const int inf=0x3f3f3f3f; int n,inn[N],cnt,s[N],mp[N][N],top; string S = "No Solution"; inline int judge(char x){ if('a'<=x&&x<='z') return x-'a'+27; else return x-'A'+1;} inline char prt(int x){ if(x<=26) return x+'A'-1; return x+'a'-27;} inline void insert(int u,int v){ ++inn[u];++inn[v]; mp[u][v]=mp[v][u]=1;} void dfs(int u){ for(int v=1;v<=52;v++) if(mp[u][v]){ mp[u][v]=mp[v][u]=0;dfs(v);} s[++top]=u;} int main(){ cin>>n; char ch[5]; for(int i=1;i<=n;i++){ scanf("%s",ch); insert(judge(ch[0]),judge(ch[1]));} int p=inf; for(int i=1;i<=52;i++) if(inn[i]&1)//欧拉路径起点:奇数 p = min(p,i),++cnt; if(cnt!=0&&cnt!=2){ cout<<S;return 0;} if(cnt == 0)//欧拉回路起点,找最小 for(int i=1;i<=52;i++) if(inn[i]){p = i;break;} dfs(p); for(int i=top;i>=1;--i) printf("%c",prt(s[i])); return 0; }