cf C. Valera and Elections
http://codeforces.com/contest/369/problem/C
先见边,然后dfs,在回溯的过程中,如果在这个点之后有多条有问题的边,就不选这个点,如果没有而且连接这个点的边还是有问题的边,这个点就是所求的点。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 200000 5 using namespace std; 6 7 int head[maxn],e,cnt,n; 8 int ans[maxn]; 9 bool vis[maxn]; 10 int point[maxn]; 11 struct node 12 { 13 int u,v,w; 14 int next; 15 } p[maxn]; 16 17 void add(int u,int v,int w) 18 { 19 p[e].u=u; 20 p[e].v=v; 21 p[e].w=w; 22 p[e].next=head[u]; 23 head[u]=e++; 24 } 25 26 void cls() 27 { 28 memset(head,-1,sizeof(head)); 29 memset(vis,false,sizeof(vis)); 30 memset(ans,0,sizeof(ans)); 31 e=0; 32 cnt=0; 33 } 34 35 int dfs(int u,int flag) 36 { 37 vis[u]=1; 38 for(int i=head[u]; i!=-1; i=p[i].next) 39 { 40 int v=p[i].v,w=p[i].w; 41 if(!vis[v]) 42 { 43 ans[u]+=dfs(v,w); 44 } 45 } 46 if(flag==2||ans[u]>=1) 47 { 48 if(ans[u]==0) 49 point[cnt++]=u; 50 return 1; 51 } 52 return 0; 53 } 54 55 int main() 56 { 57 while(scanf("%d",&n)!=EOF) 58 { 59 cls(); 60 for(int i=1; i<=n-1; i++) 61 { 62 int a,b,c; 63 scanf("%d%d%d",&a,&b,&c); 64 add(a,b,c); 65 add(b,a,c); 66 } 67 dfs(1,0); 68 printf("%d\n",cnt); 69 for(int i=0; i<cnt; i++) 70 { 71 if(i==0) printf("%d",point[i]); 72 else printf(" %d",point[i]); 73 } 74 printf("\n"); 75 } 76 return 0; 77 }