CF717E

这道题属于是那种看上去很有思路,然后无从下手,写了个dfs感觉实在是不行。
后面仔细看了一下,这个题是用的构造dfs,基本是树上dfs,时间复杂度是O(V+E)
新构造的一个参数作为根,整个dfs表示这个根的子树已经全部变为黑色(除了根以外)
刚开始是一直搜,搜到最后如果是粉的,递归以后再单独处理一次
其实当时如果能想到直接从每个结点的根结点入手,这个题应该就不在话下了
只能说写着写着心乱了

#include<iostream>
#include<utility>
#include<vector>
using namespace std;
typedef long long ll;
#define fi(i,a,b) for(int i = a; i <= b; ++i)
#define fr(i,a,b) for(int i = a; i >= b; --i)
#define x first
#define y second
#define sz(x) ((int)(x).size())
#define pb push_back
using pii = pair<int,int>;
//#define DEBUG
#define int long long
const int N = 2e5 + 5;
vector<int> tre[N];
int vex[N];
void dfs(int x,int y){
    fi(i,0,sz(tre[x])-1){
        int v = tre[x][i];
        if(v == y) continue;
        vex[v] ^= 1;
        cout << v << " ";
        dfs(v,x);
        cout << x << " ";
        vex[x] ^= 1;
        if(vex[v] == 0) 
            cout << v << " " << x << " ",vex[v] ^=1 ,vex[x] ^= 1;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    fi(i,1,n) cin >> vex[i],vex[i] = max(vex[i],(ll)0);
    fi(i,1,n-1){
        int a,b;
        cin >> a >> b;
        tre[a].pb(b);
        tre[b].pb(a);
    }
    cout << 1 << " ";
    dfs(1,0);
    if(vex[1] == 0) 
        cout << tre[1][0] << " " << 1 << " " << tre[1][0];
#ifdef DEBUG
    //freopen(D:\in.txt,r,stdin);
#endif
    return 0;
}
posted @ 2022-02-01 17:00  Sun-Wind  阅读(57)  评论(0编辑  收藏  举报