图论:fleury算法

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

struct
{
    int top;
    int node[200];
}s;

int g[200][200],c[200],n,m;

void dfs(int x)
{
    int i;
    s.top++;
    s.node[s.top]=x;

    for(i=0;i<n;i++)
    {
        if(g[i][x]>0)
        {
            g[i][x]=g[x][i]=0;
            dfs(i);
            break;
        }
    }
}

void fleury(int st)
{
    int u,v,i,f;
    s.top=0;
    s.node[s.top]=st;
    while(s.top>=0)
    {
        u=s.node[s.top];
        f=0;
        for(i=0;i<n;i++)
        {
            if(g[u][i]>0)
            {
                f=1;break;
            }
        }

        if(f)
        {
            s.top--;
            dfs(u);
        }
        else
        {
            printf("%d ",u+1);
            s.top--;
        }
    }

}

int main()
{
    int u,v,i,j;
    while(~scanf("%d%d",&n,&m))
    {
        memset(g,0,sizeof(g));
        memset(c,0,sizeof(c));
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            u--;
            v--;
            c[u]++;
            c[v]++;
            g[u][v]=g[v][u]=1;
        }
        int st=0;
        int num=0;
        for(i=0;i<n;i++)
        {
           if(c[i]%2==1)
           {
               st=i;
               num++;
           }
        }
        if(num==0||num==2) fleury(st);
        else printf("eorr\n");
    }
    return 0;
}
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

struct
{
    int top;
    int node[200];
}s;

int g[200][200],c[200],n,m;

void dfs(int x)
{
    int i;
    s.top++;
    s.node[s.top]=x;

    for(i=0;i<n;i++)
    {
        if(g[i][x]>0)
        {
            g[i][x]=g[x][i]=0;
            dfs(i);
            break;
        }
    }
}

void fleury(int st)
{
    int u,v,i,f;
    s.top=0;
    s.node[s.top]=st;
    while(s.top>=0)
    {
        u=s.node[s.top];
        f=0;
        for(i=0;i<n;i++)
        {
            if(g[u][i]>0)
            {
                f=1;break;
            }
        }

        if(f)
        {
            s.top--;
            dfs(u);
        }
        else
        {
            printf("%d ",u+1);
            s.top--;
        }
    }

}

int main()
{
    int u,v,i,j;
    while(~scanf("%d%d",&n,&m))
    {
        memset(g,0,sizeof(g));
        memset(c,0,sizeof(c));
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&u,&v);
            u--;
            v--;
            c[u]++;
            c[v]++;
            g[u][v]=g[v][u]=1;
        }
        int st=0;
        int num=0;
        for(i=0;i<n;i++)
        {
           if(c[i]%2==1)
           {
               st=i;
               num++;
           }
        }
        if(num==0||num==2) fleury(st);
        else printf("eorr\n");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-23 18:09:08

图论:fleury算法的相关文章

图论常用算法之二 算法模板及建模总结

寒假的第二周,弥补了一下图论算法.在这里做一下总结,主要针对近期学到的一些建模技巧,同时也非常感谢有朋友能够给出图论算法相关的精彩讲解或者知识链接. 算法总结: 欧拉回路问题:判断图是否存在欧拉回路或者欧拉通路,输出一条欧拉回路. 学习Fleury算法输出一条欧拉回路. 1 /* G是连通无向图,则称经过G的每条边一次并且仅一次的路径为 2 欧拉通路,起点和终点是同一个顶点称为欧拉回路,具有欧拉回路的 3 无向图为欧拉图. 4 依次有有向欧拉通路,有向欧拉回路,有向欧拉图 5 定理:连通图G仅有

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

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

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

【欧拉回路】【Fleury算法】CDOJ1642 老当益壮, 宁移白首之心?

题意: 构造一个01串,使得满足以下条件: 1. 环状(即首尾相连) 2. 每一位取值为0或1 3. 长度是2^n 4. 对于每个(2^n个)位置,从其开始沿逆时针方向的连续的n位01串(包括自己) 构成的数均不相同,即0到2^n?1中的数各出现一次 数据范围: 1<=n<=15 欧拉回路 考虑用一条边表示一个数,那么题目要求就是无重复的遍历完所有边, 则这是一个欧拉图的问题. 对于有公共点的两条边,第一个的后n-1位和第二个的前n-1相同. 这样将一条边的前n-1位和后n-1位作为点,连边,

【uva 658】It&#39;s not a Bug, it&#39;s a Feature!(图论--Dijkstra算法+二进制表示)

题意:有n个潜在的bug和m个补丁,每个补丁用长为n的字符串表示.首先输入bug数目以及补丁数目.然后就是对m 个补丁的描述,共有m行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,地一个字符串 是对软件的描述,只有软件处于该状态下才能打该补丁该字符串的每一个位置代表bug状态(-代表该位置没bug,+代 表该位置有bug,0表示该位置无论有没有bug都可打补丁).然后第二个字符串是对打上补丁后软件状态的描述 -代表该位置上的bug已经被修复,+表示该位置又引入了一个新的bug

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,字符串里面有大写字母,小写字

欧拉回路&amp;Fleury算法&amp;实现

基本知识 欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路.具有欧拉回路的图成为欧拉图. 判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度. 无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的. 判断欧拉回路是否存在的方法 有向图:图连通,所有的顶点出度=入度. 无向图:图连通,所有顶点都是偶数度. 程序实现一般是如下过程: 1.利用并查集判

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 - 1181 - 欧拉路&#183;二 (Fleury算法求欧拉路径)

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