标签:tab inf text max with 0ms ext imu queue
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 11934 | Accepted: 5519 |
Description
Input
Output
Sample Input
11 6 1 2 1 3 1 4 1 5 2 6 2 7 2 8 4 9 4 10 4 11
Sample Output
2
Hint
Source
#include<iostream> #include<cstring> #include<cstdio> #include<vector> #include<queue> #include<stack> #include<algorithm> using namespace std; inline int read(){ int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; return x*f; } const int MAXN=100001; const int INF=999999; int N,M; vector<int> vec[201]; int dp[201][201]; int ans=INF; void dfs(int x,int fa){ int cnt=0; for(int i=0;i<vec[x].size();i++){ if(vec[x][i]!=fa) dfs(vec[x][i],x),cnt++; } dp[x][1]=dp[x][0]=0; for(int i=0;i<vec[x].size();i++){ if(vec[x][i]!=fa) for(int j=M;j>=1;j--){ if(dp[x][j]!=INF) dp[x][j]++; for(int k=1;k<=M;k++){ if(k>=j||dp[vec[x][i]][k]==INF) break; if(dp[x][j-k]!=INF) dp[x][j]=min(dp[vec[x][i]][k]+dp[x][j-k],dp[x][j]); } } } if(x!=1) ans=min(ans,dp[x][M]+1); else ans=min(ans,dp[x][M]); return ; } int main(){ N=read(),M=read(); for(int i=0;i<=N;i++) for(int j=0;j<=M;j++) dp[i][j]=INF; for(int i=1;i<N;i++){ int u=read(),v=read(); vec[u].push_back(v); vec[v].push_back(u); } dp[1][1]=0; dfs(1,-1); if(ans!=INF) printf("%d\n",ans); else puts("0"); } //dp[i][j]表示i号节点的子树中隔离成为大小为j个的道路数量 //dp[i][k]=min(dp[i->son][j]+dp[i][k-j])
标签:tab inf text max with 0ms ext imu queue
原文地址:http://www.cnblogs.com/wxjor/p/7270908.html