標籤:define size -- open blog 操作 節點 inline return
題意:
給你一棵樹,2e5個節點,每個節點有一種顏色(黑色或粉色)
讓你從節點1開始,自由沿邊行走,到達節點時會把這個節點的顏色改變
要求你輸出任意一條路徑使得從節點1出發,所有節點的顏色都變為黑色
思路:
很明顯要遞迴遍曆
每到達一個節點就先改變節點的顏色標誌並輸出當前節點
如果當前到達了葉子節點,則不用進行操作
返回上層節點時再改變節點的顏色標誌並輸出當前節點,然後判斷葉子節點的顏色,如果為粉色,則再到達一次葉子節點再回到當前節點
這樣確保當前節點的所有兒子節點都為黑色的
然後就這樣一直遞迴到根節點1,判斷根節點的顏色
如果為黑色(其實這代表著根節點為粉色,因為剛進入dfs的時候根節點的顏色被改變了一次,但是那次是不算改變的,所以顏色正好相反了)
則去他的兒子節點(兒子粉)再回來(根黑)再去那個兒子節點(兒子黑)這樣就使得所有的節點都是黑色的了
如果為粉色的話就直接不用操作了,已經完成了要求
/* ***********************************************Author :devil************************************************ */#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <stack>#include <map>#include <string>#include <cmath>#include <stdlib.h>#define LL long long#define rep(i,a,b) for(int i=a;i<=b;i++)#define dep(i,a,b) for(int i=a;i>=b;i--)#define ou(a) printf("%d\n",a)#define pb push_back#define mkp make_pairtemplate<class T>inline void rd(T &x){ char c=getchar(); x=0; while(!isdigit(c))c=getchar(); while(isdigit(c)) { x=x*10+c-‘0‘; c=getchar(); }}#define IN freopen("in.txt","r",stdin);#define OUT freopen("out.txt","w",stdout);using namespace std;const int inf=0x3f3f3f3f;const int mod=1e9+7;const int N=2e5+10;vector<int>eg[N];bool a[N];void fun(int u){ a[u]^=1; printf("%d ",u);}void dfs(int u,int fa){ fun(u); for(int i=0;i<eg[u].size();i++) { int v=eg[u][i]; if(v==fa) continue; dfs(v,u); fun(u); if(a[v]) fun(v),fun(u); } if(u==1&&!a[u]) fun(eg[u][0]),fun(u),fun(eg[u][0]);}int main(){#ifndef ONLINE_JUDGE IN#endif int n,x,y; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); a[i]=x==-1?1:0; } for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); eg[x].pb(y); eg[y].pb(x); } dfs(1,0); return 0;}
codeforces717E Paint it really, really dark gray(樹上dfs)