P2279 [HNOI2003]消防局的设立

P2279 [HNOI2003]消防局的设立
考场上想出了贪心策略,但是处理细节时有点问题,gg了。从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<ctime>
  7 #include<set>
  8 #include<map>
  9 #include<stack>
 10 #include<cstring>
 11 #define inf 2147483647
 12 #define For(i,a,b) for(register int i=a;i<=b;i++)
 13 #define p(a) putchar(a)
 14 #define g() getchar()
 15 //by war
 16 //2017.11.1
 17 using namespace std;
 18 int n,x,k=2;
 19 int d[1010];
 20 int cnt;
 21 int ans;
 22 bool vis[1010];
 23 struct node 
 24 {
 25     int n;
 26     node *next;
 27 }*e[2010];
 28 
 29 struct nod
 30 {
 31     int deep;
 32     bool operator<(const nod&aa)const
 33     {
 34         return deep>aa.deep;
 35     }
 36     int pos;
 37 }a[1010];
 38 
 39 void in(int &x)
 40 {
 41     int y=1;
 42     char c=g();x=0;
 43     while(c<'0'||c>'9')
 44     {
 45     if(c=='-')
 46     y=-1;
 47     c=g();
 48     }
 49     while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+c-'0',c=g();
 50     x*=y;
 51 }
 52 void o(int x)
 53 {
 54     if(x<0)
 55     {
 56         p('-');
 57         x=-x;
 58     }
 59     if(x>9)o(x/10);
 60     p(x%10+'0');
 61 }
 62 
 63 void push(int x,int y)
 64 {
 65     node *p;
 66     p=new node();
 67     p->n=y;
 68     if(e[x]==NULL)
 69     e[x]=p;
 70     else
 71     {
 72         p->next=e[x]->next;
 73         e[x]->next=p;
 74     }
 75 }
 76 
 77 void dfs(int x,int dis)
 78 {
 79     if(dis>k)
 80     return;
 81     vis[x]=true;
 82     cnt--;    
 83     for(node *i=e[x];i!=NULL;i=i->next)
 84     dfs(i->n,dis+1);
 85 }
 86 
 87 int main()
 88 {
 89     in(n);
 90     cnt=n;
 91     For(i,2,n)
 92     {
 93         in(x);
 94         push(x,i);
 95         push(i,x);
 96         a[i].deep=a[x].deep+1;
 97         d[i]=x;
 98         a[i].pos=i;
 99     }
100     a[1].pos=1;
101     d[1]=1;
102     sort(a+1,a+n+1);
103     while(cnt>0)
104     {
105         For(i,1,n)
106         if(!vis[a[i].pos])
107         {
108             x=a[i].pos;
109             For(j,1,k)
110             x=d[x];
111             dfs(x,0);
112             ans++;
113         }
114     }
115     o(ans);
116      return 0;
117 }
原文地址:https://www.cnblogs.com/war1111/p/7767903.html