cf C. Valera and Elections

http://codeforces.com/contest/369/problem/C

先见边,然后dfs,在回溯的过程中,如果在这个点之后有多条有问题的边,就不选这个点,如果没有而且连接这个点的边还是有问题的边,这个点就是所求的点。

 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 }
View Code

 

posted @ 2014-09-11 21:01  null1019  阅读(189)  评论(0编辑  收藏  举报