记录编号 167846 评测结果 AAAAAAAAAAAAAA
题目名称 重建道路 最终得分 100
用户昵称 Gravatar啊吧啦吧啦吧 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2015-06-29 15:06:11 内存使用 0.40 MiB
显示代码纯文本
#include<iostream>
#include<vector>
#include<algorithm>
#include<climits>
#include<fstream>

using namespace std;
typedef vector<int> vi;

const int MAXN = 151;
int n, p, dp[MAXN][MAXN] = {0}, fa[MAXN] = {0}, root, ans = INT_MAX;
vi son[MAXN];
void dfs(int);
ifstream fi("reroads.in");
ofstream fo("reroads.out");
#define cin fi
#define cout fo

main()
{
	ios::sync_with_stdio(0);
	cin >> n >> p;
	for(int i = 1; i < n; i ++)
	{
		int a, b;
		cin >> a >> b;

		fill(dp[i], dp[i] + p + 1, 65536 * 2);
		fa[b] = a;
		son[a].push_back(b);
	}
	fill(dp[n], dp[n] + p + 1, 65536 * 2);
	for(int i = 1; i <= n; i ++)
		if(fa[i] == 0)
		{
			root = i;
			break;
		}
	dfs(root);
	ans = dp[root][p];
	for(int i = 1; i <= n; i ++)
	{
		ans = min(ans, dp[i][p] + 1);
//		cout << dp[i][p] << endl;
	}
	cout << ans;
}

void dfs(int node)
{
	dp[node][1] = 0;
	for(vi::iterator it = son[node].begin(); it != son[node].end(); ++ it)
	{
		dfs(*it);
		for(int i = p; i >= 1; i --)
		{
			dp[node][i] ++;
			for(int j = 1; j < i; j ++)			
				dp[node][i] = min(dp[node][i], dp[*it][i - j] + dp[node][j]);
		}
	}
}