P2731 [USACO3.3] 騎馬修柵欄 Riding the Fences

纯粹的發表於2024-06-08

原題連結

題解

貪心走最小的點,由於每個點都有偶數條邊,所以能進入就一定能出去

code

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int to,id;
};
vector<node> G[505];
int late[505]={0};
int vis[1044]={0};
int start=1,finish;

stack<int> st;
int n,m;


void ss(int now)
{
    for(int i=late[now];i<G[now].size();i=late[now])
    {
        late[now]=i+1;
        int to=G[now][i].to,id=G[now][i].id;
        if(!vis[id])
        {
            vis[id]=1;
            ss(to);
        }
    }

    st.push(now);
}


int main()
{
    cin>>m;

    for(int i=1;i<=m;i++)
    {
        int u,v;
        cin>>u>>v;
        G[u].push_back({v,i});
        G[v].push_back({u,i});
        n=max(n,u);
        n=max(n,v);
    }


    int flag=0;
    for(int i=1;i<=n;i++)
    {
        sort(G[i].begin(),G[i].end(),[](const node &a,const node &b){return a.to<b.to;});
        int con=G[i].size();
        if(con&1)
        {
            if(!flag)
            {
                start=i;
                flag=1;
            }
            else
            {
                finish=i;
            }
        }
    }

    ss(start);

    while(st.size())
    {
        cout<<st.top()<<endl;
        st.pop();
    }
    return 0;
}

相關文章