Fleury算法求欧拉路径 hiho第50周

题目链接:  hiho一下 第五十周

思路:hiho已经讲的非常好了,我就不插嘴了。

提示:因为建边时同一条边同相反相的编号相近,比如(u-v)正向边u->v标号为0,反向边v->u标号为1,而0或1除以2都等于0,所以无论正反向建边,只要访问过正向反向中的任何一条边都可以用head[u]/2把原边标记为vis=1操作

/**************************************************************
    Problem:hiho 50
    User: youmi
    Language: C++
    Result: Accepted
    Time:3ms
    Memory:0MB
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <sstream>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define rep0(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define pt(a) printf("%d\n",a)
#define lson (step<<1)
#define rson (lson+1)
#define esp 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl

using namespace std;
typedef long long ll;

int n,m;

const int maxn=1000+10;
const int maxm=5000+10;
int head[maxn],euler[maxm],vis[maxn],deg[maxm<<1];//因为输出m+1个点,所以euler的大小应该为maxm
int tot,T;
struct side
{
    int v,next;
}e[maxm<<1];
void build(int u,int v)
{
    e[T].v=v;
    e[T].next=head[u];
    head[u]=T++;
}

void init()
{
    tot=0;
    T=0;
    ones(head);
    zeros(vis);
    zeros(deg);
}
void dfs(int u)
{
    //pt(u);
    while(head[u]!=-1)
    {
        int v=e[head[u]].v;
        if(!vis[head[u]/2])
        {
            vis[head[u]/2]=1;//标记无向边u-v访问过
            dfs(v);
        }
        head[u]=e[head[u]].next;//删除操作
    }
    euler[++tot]=u;//记录欧拉路径
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~sc2(n,m))
    {
        init();
        int u,v;
        while(m--)
        {
            sc2(u,v);
            build(u,v);
            build(v,u);
            deg[u]++;
            deg[v]++;
        }
        int flag=1;
        rep1(i,n)//查找度为奇数的点,如果都为偶数,那么随便从哪个点开始dfs都一样
        {
            if(deg[i]%2)
            {
                flag=i;
                break;
            }
        }
        dfs(flag);
        rep1(i,tot)
        {
            printf("%d ",euler[i]);
        }
        printf("\n");//其实这句加不加都一样,对输出要求相当宽松
    }
    return 0;
}
时间: 2024-10-12 13:05:32

Fleury算法求欧拉路径 hiho第50周的相关文章

hihoCoder - 1181 - 欧拉路&#183;二 (Fleury算法求欧拉路径)

#1181 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着: 将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙.切记骨牌需要数字相同才能连接. --By 无名的冒险者 小Hi和小Ho打开了主角的道具栏,发现

hiho欧拉路&#183;二 ----- Fleury算法求欧拉路径

hiho欧拉路·二 分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇到问题. 小Ho:小Hi快来帮帮我! 小Hi:好了,好了.让我们一起来解决这个问题. <小Hi思考了一下> 小Hi:原来是这样...小Ho你仔细观察这个例子: 因为相连的两个数字总是相同的,不妨我们只写一次,那么这个例子可以写成:3-2-4-3-5-1.6个数字刚好有5个间隙,每个间隙两边的数字由

HihoCoder1181欧拉路(Fleury算法求欧拉路径)

描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着: 将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙.切记骨牌需要数字相同才能连接. ——By 无名的冒险者 小Hi和小Ho打开了主角的道具栏,发现主角恰好拥有M快骨牌. 小Ho:也就是说要把所有骨牌都放在凹槽中才能关闭火焰墙,数字相同是什么意思?

Fleury算法 求欧拉回路

Fleury算法 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #in

hihoCoder 第 50 周欧拉路二之C实现方法

题目1 : 欧拉路·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌. 主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过. 小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着: 将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙.切记骨牌需要数字相同才能连接. --By 无名的冒险者 小Hi和小Ho打开了主角的道具栏,发现主角

欧拉路径 提高篇 hiho第51周

题目链接:hiho 第51周 思路:首先特判n=1的情况,无输出.对于其他的按有向欧拉路径的求法把欧拉路径求出来以后,第一个按位全输出,接下来的的(2^n-1)个点,只需要输出二进制最后一位就可以了.详细的思路参考hiho 第51周 /************************************************************** Problem:hiho 第51周 User: youmi Language: C++ Result: Accepted Time:17m

欧拉路径 基础题 hiho第49周

题目链接:hiho 第49周 思路: 定义:给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,该条路称为欧拉路. 性质:  1: 一个无向图存在欧拉路当且仅当该图是连通的且有且只有2个点的度数是奇数,此时这两个点只能作为欧拉路径的起点和终点.  2: 若图中没有奇数度的点,那么起点和终点一定是同一个点,这样的欧拉路叫做欧拉回路 利用性质做题就好了,具体的模拟hiho讲的非常清楚了 /****************************************************

【欧拉回路】【欧拉路径】【Fleury算法】CDOJ1634 记得小苹初见,两重心字罗衣

Fleury算法看这里 http://hihocoder.com/problemset/problem/1181 把每个点看成边,每个横纵坐标看成一个点,得到一个无向图. 如果新图中每个点的度都是偶数,那么就是一个欧拉图,对该图跑一遍欧拉回路,对走过的边轮流染色,就可以保证每个点所连的边的红蓝颜色相等. 如果存在度数为奇数的点,新建两个点a和b.把横坐标的度数为奇数的点和a连边,把纵坐标为奇数的点和b连边,这样最多只有a和b的度数为奇数,可以跑欧拉路径. 注意Fleury算法的时候,要及时把访问

codeforces 508 D. Tanya and Password (fleury算法)

codeforces 508 D. Tanya and Password (fleury算法) 题目链接: http://codeforces.ru/problemset/problem/508/D 题意: 给出n个长度为3的字符串,如:abc bca aab 如果一个字符串的长度为2的后缀等于,另外一个字符串的长度为2的前缀,则这两个字符串能连起来,比如:aabca,然后这n个字符串可以形成一个图,求图上的一条欧拉通路. 限制: 1 <= n <= 2*10^5,字符串里面有大写字母,小写字