87TLE求助

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

NumberTrart @ 2024-05-16 21:40:28

#include <algorithm>//STL 通用算法
#include <cstdio>//定义输入/输出函数
#include <cstring>//字符串处理
#include <iostream>//数据流输入/输出
#include <vector>//STL 动态数组容器
using namespace std;
int m;
int g[505][505],nxt[505][505],lst[505][505];
int in[505];
int z=1;
int a[1036];
int maxx,minn=2e9;
bool dfs(int p,int dep)
{
    if(dep==m+1)
    {
        for(int i=1;i<=m;i++) cout<<a[i]<<'\n';
        cout<<p<<'\n';
        return true;
    }
    a[dep]=p;
    for(int i=nxt[p][0];i<=500;i=nxt[p][i])
        if(g[p][i])
        {
            g[p][i]--;
            g[i][p]--;
            if(!g[p][i])
            {
                lst[p][nxt[p][i]]=lst[p][i];
                nxt[p][lst[p][i]]=nxt[p][i];
            }
            if(dfs(i,dep+1)) return true;
            if(!g[p][i])
            {
                lst[p][nxt[p][i]]=i;
                nxt[p][lst[p][i]]=i;
            }
            g[i][p]++;
            g[p][i]++;
        }
    return false;
}
int main(){
    ios::sync_with_stdio(false);
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        g[u][v]++;
        g[v][u]++;
        maxx=max(maxx,max(u,v));
        minn=min(minn,min(u,v));
        in[u]++;
        in[v]++;
    }
    for(int i=minn;i<=maxx;++i)
    {
        int head=0;
        for(int j=minn;j<=maxx;++j)
            if(g[i][j])
            {
                nxt[i][head]=j;
                lst[i][j]=head;
                head=j;
            }
        nxt[i][head]=501;
        lst[i][501]=head;
    }
    //for(int i=1;i<=500;i++) sort(g[i].begin(),g[i].end());
    for(int i=minn;i<=maxx;i++)
        if(in[i]&1){
            z=i;
            break;
        }
    dfs(z,1);
    return 0;
}

链表都用了还TLE……


|