poj2230 Watchcow(打印欧拉回路模版)

题目:  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++

加油吧,渣科

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值