习题:Little Pony and Summer Sun Celebration(构造)

题目

传送门

思路

其实我们只需要考虑生成树的情况就可以了

考虑到一个点不合法其实是可以向父亲传递其的不合法来使其合法这一点

考虑如果儿子让根不合法了,那么最后停在儿子上面即可

代码

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,m,rt=-1;
int a[100005],now[100005];
bool vis[100005],f;
vector<int> g[100005],ans;
void dfs(int u,int fa)
{  
    ans.push_back(u);
    now[u]^=1;
    vis[u]=1;
    for(int i=0;i<g[u].size();i++)
    {
        int v=g[u][i];
        if(vis[v]==0)
        {
            dfs(v,u);
            ans.push_back(u);
            now[u]^=1;
		}	
	}
    if(now[u]!=a[u])
    {
        if(u==rt)
            f=1;
        ans.push_back(fa);
        ans.push_back(u);
        now[u]^=1;
        now[fa]^=1;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1,u,v;i<=m;i++)
    {
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);  
    }
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
        if(a[i]!=now[i])
        {
            rt=i;
            break;
        }
    if(rt==-1)
    {
    	cout<<"0";
    	return 0;
	}
    dfs(rt,0);
    for(int i=1;i<=n;i++)
        if(a[i]!=now[i])
        {
            cout<<"-1";
            return 0;
        }
    if(f)
    {
        ans.pop_back();
        ans.pop_back();
        ans.pop_back();
    }
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++)
        cout<<ans[i]<<' ';
    return 0;
}
posted @ 2020-07-27 22:09  loney_s  阅读(94)  评论(0)    收藏  举报