题意:给你一棵数,每个桥有两种状态,好或者坏,要求你求最小的节点集合,使得修复所有的坏桥(选一个点以后,这个点到1节点之间所有的桥都变好)
解题思路:两次dfs 第一次判断这个支路或者后续有没有坏桥,第二个dfs求点集合
解题代码
1 // File Name: c.c 2 // Author: darkdream 3 // Created Time: 2014年11月30日 星期六 00时09分50秒 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<time.h> 9 #include<math.h> 10 #pragma comment(linker,"/STACK:102400000,102400000") 11 #define maxn 200005 12 struct node{ 13 int v; 14 int is; 15 struct node *next; 16 }map[maxn]; 17 int num[maxn]; 18 struct node *newnode(int a,int c) 19 { 20 struct node *p = (node*)malloc(sizeof(node)); 21 p->v = a ; 22 if(c == 1) 23 p->is = 1; 24 else p->is = 0; 25 p->next = NULL; 26 return p; 27 } 28 int ansnum = 0 ; 29 int ans[maxn]; 30 int ok[maxn]; 31 int visit[maxn]; 32 int dfs(int k ) 33 { 34 struct node *p = &map[k]; 35 int t = 0 ; 36 for(int i =1 ;i <= num[k]; i ++) 37 { 38 p = p->next; 39 if(!visit[p->v]) 40 { 41 visit[p->v] = 1; 42 if(!p->is) 43 {ok[k] = 1; 44 ok[p->v] = 1; 45 } 46 if(dfs(p->v)) 47 ok[k] = 1; 48 } 49 } 50 if(ok[k]) 51 return 1; 52 else return 0; 53 } 54 55 void dfs1(int k) 56 { 57 struct node *p = &map[k]; 58 int t = 0 ; 59 for(int i =1 ;i <= num[k]; i ++) 60 { 61 p = p->next; 62 if(!visit[p->v] && ok[p->v]) 63 { 64 t ++; 65 visit[p->v] = 1; 66 dfs1(p->v); 67 } 68 } 69 if(t == 0 && ok[k] ) 70 { 71 ansnum ++; 72 ans[ansnum] = k ; 73 return ; 74 } 75 76 } 77 int main(){ 78 int n; 79 scanf("%d",&n); 80 memset(num,0,sizeof(num)); 81 memset(map,0,sizeof(map)); 82 memset(ok,0,sizeof(ok)); 83 for(int i =1;i <= n -1;i ++) 84 { 85 int ta,tb,tc; 86 scanf("%d %d %d",&ta,&tb,&tc); 87 88 num[ta]++; 89 struct node *p = newnode(tb,tc); 90 struct node *temp ; 91 temp = map[ta].next; 92 map[ta].next = p; 93 p->next = temp; 94 95 96 num[tb]++; 97 p = newnode(ta,tc); 98 temp = map[tb].next; 99 map[tb].next = p; 100 p->next = temp; 101 102 } 103 memset(visit,0,sizeof(visit)); 104 visit[1] = 1 ; 105 dfs(1); 106 /* for(int i =1 ;i <=n;i ++) 107 printf("%d ",ok[i]); 108 printf("\n");*/ 109 memset(visit,0,sizeof(visit)); 110 visit[1] = 1; 111 dfs1(1); 112 printf("%d\n",ansnum); 113 for(int i= 1 ;i <= ansnum ;i ++) 114 { 115 printf("%d ",ans[i]); 116 } 117 118 return 0 ; 119 }