比赛 |
EYOI与SBOI开学欢乐赛7th |
评测结果 |
AAAWAWAAAAAAAA |
题目名称 |
重建道路 |
最终得分 |
85 |
用户昵称 |
遥时_彼方 |
运行时间 |
0.003 s |
代码语言 |
C++ |
内存使用 |
0.42 MiB |
提交时间 |
2022-09-23 20:44:53 |
显示代码纯文本
- #include<bits/stdc++.h>
- #define rep(x,y,z) for(int x=y;x<=z;x++)
- #define drep(x,y,z) for(int x=y;x>=z;x--)
- #define ull unsigned long long
- #define ll long long
- using namespace std;
- inline int read()
- {
- int x=0;bool flag=1;char ch=getchar();
- while(ch<'0'||ch>'9') {if(ch=='-')flag=0;ch=getchar();}
- while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
- if(flag) return x;
- return ~(x-1);
- }
- inline void write(int x)
- {
- if(x<0) {x=~(x-1);putchar('-');}
- if(x>9) write(x/10);
- putchar(x%10+'0');
- }
- //
- const int N=200;
- int nc,pc;
- int hd[N];
- struct qxx
- {
- int ar;
- int nx;
- }a[N<<1];
- int aj;
- inline void ADD(int x,int y)
- {
- a[++aj].ar=y;
- a[aj].nx=hd[x];
- hd[x]=aj;
- }
- int sz[N];//以x为根节点的大小
- int f[N][N];//f[x][y]以x为根,少y个牲口棚的最小代价
- int ans=9999;
- int d[N];
- inline void dp(int x,int y)
- {
- memset(d,0x3f,sizeof(d));
- rep(i,1,sz[y])
- {
- rep(o,f[y][i],sz[x])
- {
- d[o]=min(d[o],f[x][o-i]+f[y][i]);
- }
- }
- rep(i,1,sz[x]) f[x][i]=min(f[x][i],d[i]);
- }//分组背包
- void dfs(int cl,int fa)
- {
- sz[cl]=1;
- f[cl][0]=0;
- for(int i=hd[cl];i;i=a[i].nx)
- {
- if(a[i].ar==fa) continue;
- dfs(a[i].ar,cl);
- sz[cl]+=sz[a[i].ar];
- f[a[i].ar][sz[a[i].ar]]=1;
- dp(cl,a[i].ar);
- }
- ans=min(ans,f[cl][nc-pc]);
- if(sz[cl]==nc-pc) ans=1;
- }
- int main()
- {
- freopen("reroads.in","r",stdin);
- freopen("reroads.out","w",stdout);
- nc=read(),pc=read();
- int s1,s2;
- rep(i,2,nc) s1=read(),s2=read(),ADD(s1,s2),ADD(s2,s1);
- memset(f,0x3f,sizeof(f));
- dfs(1,0);
- // rep(i,1,nc) cout<<i<<":"<<sz[i]<<endl;
- write(ans),putchar(10);
- return 0;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-