题意:给你一棵数,每个桥有两种状态,好或者坏,要求你求最小的节点集合,使得修复所有的坏桥(选一个点以后,这个点到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 }
View Code

相关文章:

  • 2021-07-02
  • 2021-06-17
  • 2023-03-18
  • 2022-03-10
  • 2021-10-09
  • 2022-02-15
  • 2021-10-19
猜你喜欢
  • 2022-12-23
  • 2021-05-06
  • 2021-10-20
  • 2021-09-27
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案