• luogu P2731 骑马修栅栏 Riding the Fences | 欧拉道路


    luogu P2731 骑马修栅栏 Riding the Fences

    luogu P1341 无序字母对

    度数:一个点上连接边的个数

    1.欧拉道路:相当于一笔画

     无向图:除了两个或没有点为奇点(度数为奇)以外,其余度数均为偶

     有向图:只有两个点或没有点入度不等于出度,起点入度=出度-1,终点入度=出度+1

    2.欧拉回路:

     无向图:奇点个数为0

     有向图:所有点出度=入度(起点终点重合)

     

    #include<cstdio>
    #include<iostream>
    using namespace std;
    const int maxn=2500;
    int f,head[maxn],nxt[maxn],to[maxn],du[maxn],cnt=-1,t,zhan[maxn],vis[maxn];
    void add(int a,int b)
    {
        cnt++;
        nxt[cnt]=head[a];
        to[cnt]=b;
        head[a]=cnt;
    }
    void dfs(int k)
    {
        while(du[k])
        {
            int mi=2e9,tomi=2e9;
            for(int i=head[k];i!=-1;i=nxt[i])
            {
                if(!vis[i]&&to[i]<tomi) mi=i,tomi=to[i];  //题中要求存在多组解的情况下,输出进制表示法中最小的一个
            }
            vis[mi]=1;
            vis[mi^1]=1;
            du[k]--;
            du[tomi]--;
            dfs(tomi);
            zhan[++t]=tomi;
        }
    }
    int main()
    {
        scanf("%d",&f);
        int a,b,minn=2e9;
        for(int i=0;i<1050;i++) head[i]=-1;
        for(int i=1;i<=f;i++)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
            du[a]++;
            du[b]++;
            minn=min(min(a,b),minn);
        }
        for(int i=1;i<=f;i++)
        {
            if(du[i]%2==1)
            {
                minn=i;
                break;
            }
        }
        dfs(minn);
        printf("%d
    ",minn);
        for(int i=t;i>0;i--) printf("%d
    ",zhan[i]);
        return 0;
    }
  • 相关阅读:
    Django入门
    html语言
    elasticsearch基本接口使用
    linux随笔
    mysql基础操作
    mysql存储引擎
    MySQL字符集
    并发编程之多进程
    异常处理
    socket编程
  • 原文地址:https://www.cnblogs.com/QAQq/p/10306371.html
Copyright © 2020-2023  润新知