zoukankan      html  css  js  c++  java
  • P2731 骑马修栅栏 Riding the Fences

      一道欧拉路径(回路)板子题。

      注意“回路”那个词,那是第一个数据点。。。

      没有特判没有找到起点的情况的话,这个点就没有分……

      一般用链前做,但是由于这道题要求字典序,所以只能用matrix(邻接矩阵)。

      下面上邻接矩阵的代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define maxn 3000
    int g[maxn][maxn],d[maxn],st[maxn];
    bool vis[maxn];
    int n,ma,mi=99999,cnt=-1,top=-1,s;
    void dfs(int u)
    {
        for(int i=mi;i<=ma;i++)
        if(g[u][i])
        {
            if(vis[i]) continue;
            g[u][i]--;
            g[i][u]--;
            dfs(i);
            st[++top]=i;
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            g[a][b]++;
            g[b][a]++;
            d[a]++;
            d[b]++;
            ma=max(ma,max(a,b));
            mi=min(mi,min(a,b));
        }
        for(int i=mi;i<=ma;i++)
        if(d[i]%2) 
        {
            s=i;
            break;
        }
        if(s==0)
        s=mi;     
        dfs(s);
        printf("%d
    ",s);
        top++;
        while(top--)
        printf("%d
    ",st[top]);
        return 0;
    }

      下面是链前代码:

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define maxn 3000
    int head[maxn],to[maxn],nxt[maxn],d[maxn],st[maxn];
    bool vis[maxn];
    int n,ma,mi=99999,cnt=-1,top=-1,s;
    void dfs(int u)
    {
        for(int i=head[u];i!=-1;i=nxt[i])
        {
            if(vis[i]) continue;
            vis[i]=1;
            vis[i^1]=1;
            dfs(to[i]);
            st[++top]=to[i];
        }
    }
    void add(int a,int b)
    {
        to[++cnt]=b;
        nxt[cnt]=head[a];
        head[a]=cnt;
    }
    int main()
    {
        memset(head,-1,sizeof(head));
        memset(nxt,-1,sizeof(nxt));
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            add(a,b);
            add(b,a);
            d[a]++;
            d[b]++;
            ma=max(ma,max(a,b));
            mi=min(mi,min(a,b));
        }
        for(int i=mi;i<=ma;i++)
        if(d[i]%2) 
        {
            s=i;
            break;
        }     
        if(!s)
        s=mi;
        dfs(s);
        printf("%d
    ",s);
        top++;
        while(top--)
        printf("%d
    ",st[top]);
        return 0;
    }

      大同小异~

  • 相关阅读:
    rtmp 之 amf
    Codeforces Round #601 (Div. 1)
    Codeforces Round #618 (Div. 1)
    Codeforces Round #694 (Div. 1) BCDE
    AtCoder Regular Contest 106 DEF
    AtCoder Grand Contest 006 BCDEFF
    JavaScript中深拷贝的实现方法
    suiidfadf
    macOs打开时提示:xxx.app已损坏修复教程
    vue通过事件对象获取标签上的属性值
  • 原文地址:https://www.cnblogs.com/popo-black-cat/p/10305510.html
Copyright © 2011-2022 走看看