题目背景
pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv
历史/落在/赢家/之手
至少/我们/拥有/传说
谁说/败者/无法/不朽
拳头/只能/让人/低头
念头/却能/让人/抬头
抬头/去看/去爱/去追
你心中的梦
题目描述
又想起了四月。
如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房。
凭君莫话封侯事,一将功成万骨枯。
梦里,小 F 成了一个给将军送密信的信使。
现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫。小 F 不因为自己的祸福而避趋之,勇敢地承担了这个任务。
不过,小 F 实在是太粗心了,他一不小心把两封密信中的一封给弄掉了。
小 F 偷偷打开了剩下的那封密信。他 发现一副十分详细的地图,以及几句批文——原来 这是战场周围的情报地图。他仔细看后发现,在这张地图上标记了 n 个从 1 到 n 标号的 驿站,n ? 1 条长度为 1 里的小道,每条小道双向连接两个不同的驿站,并且驿站之间可以 通过小道两两可达。
小 F 仔细辨认着上面的批注,突然明白了丢失的信的内容了。原来,每个驿站都可以驻 扎一个小队,每个小队可以控制距离不超过 k 里的驿站。如果有驿站没被控制,就容易产 生危险——因此这种情况应该完全避免。而那封丢失的密信里,就装着朝廷数学重臣留下的 精妙的排布方案,也就是用了最少的小队来控制所有驿站。
小 F 知道,如果能计算出最优方案的话,也许他就能够将功赎过,免于死罪。他找到了 你,你能帮帮他吗? 当然,小 F 在等待你的支援的过程中,也许已经从图上观察出了一些可能会比较有用的 性质,他会通过一种特殊的方式告诉你。
输入输出格式
输入格式:
从标准输入中读入数据。
输入第 1 行一个正整数 n,k,t,代表驿站数,一支小队能够控制的最远距离,以及特 殊性质所代表的编号。关于特殊性质请参照数据范围。
输入第 2 行至第 n 行,每行两个正整数 u_iui?,v_ivi?,表示在 u_iui? 和 v_ivi? 间,有一条长度为 一里的小道。
输出格式:
输出到标准输出中。
输出一行,为最优方案下需要的小队数。
输入输出样例
输入样例#1: 复制
4 1 0 1 2 1 3 1 4
输出样例#1: 复制
1
输入样例#2: 复制
6 1 0 1 2 1 3 1 4 4 5 4 6
输出样例#2: 复制
2
说明
【样例 1 说明】
如图。由于一号节点到周围的点距离均是 1,因此可以控制所有驿站。
【样例 2 说明】
如图,和样例 1 类似。
子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。
关于 t 的含义如下: t = 0:该测试点没有额外的特殊性质; t = 1:保证最多 8 个点的所连接的小道超过 1 条; t = 2:保证所有点到 1 号点的距离不超过 2。
每个测试点的数据规模及特点如下表
贪心,对于深度最深的未处理节点来说,反正它都最深了,那么尽量选浅一点的吧
注意树上问题不仅有父亲,儿子,还有兄弟啊啊啊~!!!
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<map> 7 #include<set> 8 #include<queue> 9 #include<vector> 10 #define INF 0x7f7f7f7f 11 #define pii pair<int,int> 12 #define ll long long 13 #define MAXN 100005 14 using namespace std; 15 int read(){ 16 int x=0,f=1;char ch=getchar(); 17 while(ch<‘0‘||ch>‘9‘){if(‘-‘==ch)f=-1;ch=getchar();} 18 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 19 return x*f; 20 } 21 int n,k; 22 int first[MAXN],nxt[MAXN<<1],to[MAXN<<1],cnt; 23 //double edge 24 int dep[MAXN],fa[MAXN]; 25 pii tmp[MAXN]; 26 int b[MAXN]; 27 28 void add(int x,int y){ 29 nxt[++cnt]=first[x];first[x]=cnt;to[cnt]=y; 30 nxt[++cnt]=first[y];first[y]=cnt;to[cnt]=x; 31 } 32 void dfs(int x){ 33 for(int e=first[x];e;e=nxt[e]){ 34 int y=to[e]; 35 if(y==fa[x]){ 36 continue; 37 } 38 fa[y]=x; 39 dep[y]=dep[x]+1; 40 dfs(y); 41 } 42 } 43 void solve(int x,int fa,int d){ 44 if(!d){ 45 return ; 46 } 47 for(int e=first[x];e;e=nxt[e]){ 48 int y=to[e]; 49 if(y==fa){ 50 continue; 51 } 52 b[y]=1; 53 solve(y,x,d-1); 54 } 55 } 56 bool comp(const pii &p1,const pii &p2){ 57 return (p1.first>p2.first); 58 } 59 int main() 60 { 61 // freopen("general2.in","r",stdin); 62 n=read();k=read(); 63 int t=read(); 64 for(int i=1;i<n;i++){ 65 int x=read(),y=read(); 66 add(x,y); 67 } 68 dep[1]=1;dfs(1); 69 for(int i=1;i<=n;i++){ 70 tmp[i]=make_pair(dep[i],i); 71 } 72 sort(tmp+1,tmp+n+1,comp); 73 int ans=0; 74 for(int i=1;i<=n;i++){ 75 int t=tmp[i].second; 76 if(!b[t]){ 77 int x=t; 78 for(int j=1;j<=k&&fa[x];j++){ 79 x=fa[x]; 80 } 81 b[x]=1; 82 solve(x,-1,k); 83 ans++; 84 } 85 } 86 printf("%d\n",ans); 87 return 0; 88 }