https://www.luogu.org/problem/P1341
如何判断一个无向图是不是欧拉图
充要条件:
图为连通图,若存在奇度顶点,则奇度顶点的个数为2
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100;
const int maxm=10000;
int n,k,in[maxn],a[maxn][maxn];
int f[maxn];
char c1,c2,ans[2000];
struct Edge
{
int before;
int to;
}e[maxm];
void init()
{
memset(in,0,sizeof in);
memset(a,0,sizeof a);
for(int i=1;i<=60;i++)
f[i]=i;
}
int find(int v)
{
if(f[v]==v)
return v;
else
return find(f[v]);
}
void dfs(int u)
{
for(int i=1;i<=60;i++)
{
if(a[u][i])
{
a[u][i]=0;
a[i][u]=0;
dfs(i);
}
}
ans[n--]=u+'A'-1;
}
int main()
{
init();
scanf("%d",&n);
int x,y;
for(int i=0;i<n;i++)
{
scanf(" %c %c",&c1,&c2);
x=c1-'A'+1;
y=c2-'A'+1;
a[x][y]=1;
a[y][x]=1;
in[x]++;
in[y]++;
int fx=find(x);
int fy=find(y);
f[max(fx,fy)]=min(fx,fy);
}
int cnt=0;
for(int i=1;i<=60;i++)
{
if(in[i]!=0&&f[i]==i)
cnt++;
}
if(cnt!=1)
return printf("No Solution"),0;
cnt=0;
int head=0;
for(int i=1;i<=60;i++)
{
if(in[i]!=0)
{
if(in[i]&1)
{
cnt++;
if(head==0)
head=i;
}
}
}
if(cnt!=2&&cnt>0)
return printf("No Solution"),0;
if(head==0)
{
for(int i=1;i<=60;i++)
if(in[i])
{
head=i;
break;
}
}
dfs(head);
for(int i=0;i<strlen(ans);i++)
printf("%c",ans[i]);
return 0;
}