如何判断图是否有欧拉回路或者欧拉路径?
无向图:因为欧拉路径中,除了起点与终点以外,任意点的“进”“出”次数相等,所以除了两个点为奇点(度数为奇数的点)(终点和起点)以外,其它点的度数均为偶数。
如果是欧拉回路,奇点的个数应该为0。
有向图:欧拉路径中,最多只有两个点的入度不等于出度。起点出度比入度大1,终点入度比出度大1。
如果是欧拉回路,所有点的 入度=出度 。
如何输出路径:
必须保证是欧拉图
#include<bits/stdc++.h>
using namespace std;
const int N=1025;
multiset<int> to[N];
multiset<int> ::iterator pos;
int len[N];
int road[N],k;
void dfs(int x)
{
for(pos=to[x].begin();pos!=to[x].end();pos=to[x].begin())
{
int u=*pos;
to[x].erase(pos);
to[u].erase(to[u].find(x));
dfs(u);
}
road[k++]=x;
}
int main(){
int m,a,b;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
len[a]++,len[b]++;
to[a].insert(b);
to[b].insert(a);
}
int s=-1,e=-1;
for(int i=1;i<=1024;i++)
if(len[i]%2==1)
{
if(s==-1)
s=i;
else if(e==-1)
e=i;
else
exit(1);
}
if(s==-1)s=1;
dfs(s);
for(k=k-1;k>=0;k--)
printf("%d\n",road[k]);
return 0;
}