P2731 骑马修栅栏 Riding the Fences

Posted popo-black-cat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

  大同小异~

以上是关于P2731 骑马修栅栏 Riding the Fences的主要内容,如果未能解决你的问题,请参考以下文章

P2731 骑马修栅栏 Riding the Fences

luogu P2731 骑马修栅栏 Riding the Fences

P2731 骑马修栅栏 Riding the Fences

题解 P2731 骑马修栅栏 Riding the Fences

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

LG2731 骑马修栅栏 Riding the Fences