抽象玄学神奇的WA

P2731 [USACO3.3] 骑马修栅栏 Riding the Fences

dbycs11 @ 2024-02-28 10:22:08

提交记录 可以看到,第一个点错了,但如果各位大佬把本辣鸡的代码把第一个点跑一边,就会发现输出和答案一样,但洛谷却判了个wa,就非常神奇,请各位大佬帮本辣鸡找找问题。

代码:

#include<iostream> 
#include<cstdio>
using namespace std;
const bool T=true,F=!T;
const int MAXN=500+10;
static int g[MAXN][MAXN],a[MAXN];
int n,m,ans,tot;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*f;
}
void Dfs(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(g[x][i]>=1)
        {
            g[x][i]--;g[i][x]--;
            Dfs(i);
        }
    }
    a[++tot]=x;
}
signed main()
{
    m=read();
    for(int i=1;i<=m;i++)
    {
        int u=read(),v=read();
        g[u][v]++;g[v][u]++;
        a[u]++;a[v]++;
        n=max(n,max(u,v));
    }
    int x;
    for(int i=1;i<=n;i++)
        if(a[i]%2)
        {
            x=i;break;
        }
    for(int i=1;i<=n;i++)a[i]=0;
    Dfs(x);
    for(int i=tot;i>=1;i--)
        cout<<a[i]<<"\n";
    return 0;
}

第一个点: IN:3 1 2 2 3 3 1 ANS:1 2 3 1


by Fimlty @ 2024-02-28 10:41:01

兄弟,x赋个初始值就行了


by naijgnorgnahz @ 2024-02-28 10:41:07

@duanboyuan1 把 O2 关上再交试试


by Fimlty @ 2024-02-28 10:41:36

#include<iostream> 
#include<cstdio>
using namespace std;
const bool T=true,F=!T;
const int MAXN=500+10;
static int g[MAXN][MAXN],a[MAXN];
int n,m,ans,tot;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*f;
}
void Dfs(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(g[x][i]>=1)
        {
            g[x][i]--;g[i][x]--;
            Dfs(i);
        }
    }
    a[++tot]=x;
}
signed main()
{
    m=read();
    for(int i=1;i<=m;i++)
    {
        int u=read(),v=read();
        g[u][v]++;g[v][u]++;
        a[u]++;a[v]++;
        n=max(n,max(u,v));
    }
    int x = 1;
    for(int i=1;i<=n;i++)
        if(a[i]%2)
        {
            x=i;break;
        }
    for(int i=1;i<=n;i++)a[i]=0;
    Dfs(x);
    for(int i=tot;i>=1;i--)
        cout<<a[i]<<"\n";
    return 0;
}

by Fimlty @ 2024-02-28 10:41:51

@duanboyuan1


by Fimlty @ 2024-02-28 10:42:55

原因是这样的,欧拉路径特殊情况下没有奇数入度的点,这时候随便哪个点做起点都可以。


by Fimlty @ 2024-02-28 10:44:13

当然,为了字典序最小,那你就从1开始走吧


by Fimlty @ 2024-02-28 10:46:35

怎么不赋初始值也能得88pts啊(((


by Huangwenqi @ 2024-03-02 19:25:47

哈哈哈,你没初始化x!


|