题目: http://poj.org/problem?id=2230
欧拉回路:是指所有的边都只经过一次且仅一次,并且要走回到出发点的一条路径
欧拉路径:表示一条不需要回到出发点,但是必须经过所有的边且都只经过一次的路径
无向图存在欧拉回路的充要条件是所有的点的度数均为偶数
无向图存在欧拉路径的充要条件是度数为奇数的点的数量为0个或者2个。
有向图存在欧拉回路的充要条件是所有的点的出度均等于入度
有向图存在欧拉路径的充要条件是:
存在欧拉回路。或者
所有点中出度比入度大1的点有一个(一定是出发点),入度比出度大1的点有一个(一定是结束点),不允许有大几个的情况
fleury算法(邻接表):
//找欧拉回路,题目说一定存在欧拉回路,故不用判断
#include<stdio.h>
struct Edge
{
int to,next;
};
const int maxn = 100000+10;
int head[maxn]={0};
int cnt=0;
Edge edge[maxn];int n,m,start;
void addEdge(int from,int to)
{
edge[++cnt].next = head[from];
edge[cnt].to = to;
head[from] = cnt;
}
int top = 0;
int st[maxn*5];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int from,to;
scanf("%d%d",&from,&to);
addEdge(from,to);//题目双向
addEdge(to,from);
}
st[++top] = 1;
int path[maxn];
int num = 0;
while(top)
{
int x = st[top];//栈顶
int p = head[x];
if(p==0)//不能拓展
{
path[num++]=x;//加入路径
top--;
continue;
}
//可以拓展,加入栈
st[++top] = edge[p].to;
head[x] = edge[p].next;//去掉这条边
}
for(int i=num-1;i>=0;i--)//输出路径
printf("%d\n",path[i]);
return 0;
}//719ms G++
加油吧,渣科