比赛 EYOI与SBOI开学欢乐赛7th 评测结果 AAAWAWAAAAAAAA
题目名称 重建道路 最终得分 85
用户昵称 遥时_彼方 运行时间 0.003 s
代码语言 C++ 内存使用 0.42 MiB
提交时间 2022-09-23 20:44:53
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. #define rep(x,y,z) for(int x=y;x<=z;x++)
  3. #define drep(x,y,z) for(int x=y;x>=z;x--)
  4. #define ull unsigned long long
  5. #define ll long long
  6. using namespace std;
  7. inline int read()
  8. {
  9. int x=0;bool flag=1;char ch=getchar();
  10. while(ch<'0'||ch>'9') {if(ch=='-')flag=0;ch=getchar();}
  11. while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  12. if(flag) return x;
  13. return ~(x-1);
  14. }
  15. inline void write(int x)
  16. {
  17. if(x<0) {x=~(x-1);putchar('-');}
  18. if(x>9) write(x/10);
  19. putchar(x%10+'0');
  20. }
  21. //
  22. const int N=200;
  23. int nc,pc;
  24. int hd[N];
  25. struct qxx
  26. {
  27. int ar;
  28. int nx;
  29. }a[N<<1];
  30. int aj;
  31. inline void ADD(int x,int y)
  32. {
  33. a[++aj].ar=y;
  34. a[aj].nx=hd[x];
  35. hd[x]=aj;
  36. }
  37. int sz[N];//以x为根节点的大小
  38. int f[N][N];//f[x][y]以x为根,少y个牲口棚的最小代价
  39. int ans=9999;
  40. int d[N];
  41. inline void dp(int x,int y)
  42. {
  43. memset(d,0x3f,sizeof(d));
  44. rep(i,1,sz[y])
  45. {
  46. rep(o,f[y][i],sz[x])
  47. {
  48. d[o]=min(d[o],f[x][o-i]+f[y][i]);
  49. }
  50. }
  51. rep(i,1,sz[x]) f[x][i]=min(f[x][i],d[i]);
  52. }//分组背包
  53. void dfs(int cl,int fa)
  54. {
  55. sz[cl]=1;
  56. f[cl][0]=0;
  57. for(int i=hd[cl];i;i=a[i].nx)
  58. {
  59. if(a[i].ar==fa) continue;
  60. dfs(a[i].ar,cl);
  61. sz[cl]+=sz[a[i].ar];
  62. f[a[i].ar][sz[a[i].ar]]=1;
  63. dp(cl,a[i].ar);
  64. }
  65. ans=min(ans,f[cl][nc-pc]);
  66. if(sz[cl]==nc-pc) ans=1;
  67. }
  68. int main()
  69. {
  70. freopen("reroads.in","r",stdin);
  71. freopen("reroads.out","w",stdout);
  72. nc=read(),pc=read();
  73. int s1,s2;
  74. rep(i,2,nc) s1=read(),s2=read(),ADD(s1,s2),ADD(s2,s1);
  75. memset(f,0x3f,sizeof(f));
  76. dfs(1,0);
  77. // rep(i,1,nc) cout<<i<<":"<<sz[i]<<endl;
  78. write(ans),putchar(10);
  79. return 0;
  80. }
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.