第十場 hdu 6178 (bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=6178php

 

題目大意:ios

已知n個節點有n-1條連線,如今有k只猴子,每隻猴子必需要住在一個節點上,兩隻猴子之間最少要有一條連線。問k只猴子最少要有多少條連線。

c++

解題思路:ide

首先因爲數據太大並且要在1s內完成因此應該用輸入掛輸入。測試了一下若是用scanf輸入耗時995ms,若是用輸入掛的話耗時421ms。
而後可以知道在一棵樹中若是有成對的節點,能夠知道節省的節點數最多就是成對的節點的個數。因此求出樹的成對的節點個數是解決問題的關鍵。
最後找出度爲1的節點放入隊列中。使用bfs訪問隊列值now,而後找出它的子節點next,若是now和next都沒有被訪問過就把他們標記成訪問,順便把對數+1。而後在next的容器中刪除now這個值,若是next容器的size是1,就把它放入隊列中.

測試

AC代碼:spa

  1 #include <iostream>
  2 #include<bits/stdc++.h>
  3 using namespace std;
  4 namespace fastIO
  5 {
  6 #define BUF_SIZE 100000
  7 #define OUT_SIZE 100000
  8 #define ll long long
  9 //fread->read
 10 bool IOerror=0;
 11 inline char nc()
 12 {
 13     static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
 14     if (p1==pend)
 15     {
 16         p1=buf;
 17         pend=buf+fread(buf,1,BUF_SIZE,stdin);
 18         if (pend==p1)
 19         {
 20             IOerror=1;
 21             return -1;
 22         }
 23         //{printf("IO error!\n");system("pause");for (;;);exit(0);}
 24     }
 25     return *p1++;
 26 }
 27 inline bool blank(char ch)
 28 {
 29     return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';
 30 }
 31 inline void read(int &x)
 32 {
 33     bool sign=0;
 34     char ch=nc();
 35     x=0;
 36     for (; blank(ch); ch=nc());
 37     if (IOerror)return;
 38     if (ch=='-')sign=1,ch=nc();
 39     for (; ch>='0'&&ch<='9'; ch=nc())x=x*10+ch-'0';
 40     if (sign)x=-x;
 41 }
 42 }
 43 using namespace fastIO;
 44 int degr[100005],vis[100005];
 45 vector<int>vec[100005];
 46 queue<int>que;
 47 int main()
 48 {
 49     int n,t,k,x;
 50     //freopen("1008.in","r",stdin);
 51     read(t);
 52     while(t--)
 53     {
 54         read(n);
 55         read(k);
 56         for(int i=0; i<=n; i++)
 57         {
 58             vec[i].clear();
 59             degr[i]=0;
 60             vis[i]=0;
 61         }
 62         for(int i=2; i<=n; i++)
 63         {
 64             read(x);
 65             vec[i].push_back(x);
 66             vec[x].push_back(i);
 67             degr[i]++;
 68             degr[x]++;
 69         }
 70         for(int i=1; i<=n; i++)
 71         {
 72             if(degr[i]==1)
 73             {
 74                 que.push(i);
 75             }
 76             degr[i]=0;
 77         }
 78         int ans=0;
 79         while(!que.empty())
 80         {
 81             int val=que.front();
 82             que.pop();
 83             int now=vec[val][0];
 84             if(vis[now]==0&&vis[val]==0)
 85             {
 86                 ans++;
 87                 vis[now]=1;
 88                 vis[val]=1;
 89             }
 90             vec[now].erase(remove(vec[now].begin(),vec[now].end(),val),vec[now].end());
 91             if(vec[now].size()==1)
 92                 que.push(now);
 93         }
 94         if(ans*2>k)
 95         {
 96             printf("%d\n",(k+1)/2);
 97         }
 98         else
 99         {
100             printf("%d\n",k-ans);
101         }
102     }
103     return 0;
104 }
View Code
相關文章
相關標籤/搜索