乱搞题,要求用最少的操作把一颗树转化成一个环。其实就是把树分成最少的链,然后连接起来即可,仔细观察树的话会发现,一般一个点的度如果大于1的话,该点必然要断开一些连接,因为最终每个点的度都是2, 然后就是看点上断开那些连接了,其实,如果一个节点的除去父亲节点如果度大于1的话,断开与父亲节点的那条边必然是一种正解。。。于是问题就解决了,只需一遍dfs即可。在杭电交注意加上挂。。。不然会爆栈。。。
#pragma comment(linker,"/STACK:102400000,102400000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#define LL long long
#define PB(a) push_back(a);
#define CLR(a, b) memset(a, b, sizeof(a))
using namespace std;
const int N = 1111111;
vector<int> E[N];
int ans;
int dfs(int u, int fa)
{
int v, i, hav = 0;
for(i = 0; i < E[u].size(); i ++)
{
v = E[u][i];
if(v != fa) hav += dfs(v, u);
}
if(fa == -1 && hav > 1) ans += hav - 2;
else if(hav > 1)
{
ans += hav - 1;
return 0;
}
return 1;
}
int main()
{
int n, t, i, j, u, v;
scanf("%d", &t);
while(t --)
{
scanf("%d", &n);
for(i = 0; i <= n; i ++) E[i].clear();
for(i = 1; i < n; i ++)
{
scanf("%d%d", &u, &v);
E[u].PB(v);
E[v].PB(u);
}
ans = 1;
dfs(1, -1);
printf("%d\n", ans * 2 - 1);
}
return 0;
}
分享到:
相关推荐
Hdu 3333解题报告 题意描述: 给你n个数现在要你求在k个区间上[ai, bi]的不相同的数之和各是多少. N,000; k,000; 显然,这题不能用暴力来做。 这题我们选择用线段数来做。
2-sat---hdu3062,代码详尽,清晰,格式规范,亲测无误。
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
杭电ACMhdu1163
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
HDU的一题........HDU DP动态规
教程来自HDU 的ACM教案,非常好的一个资料
hdu acm 教案 搜索入门 hdu acm 教案 搜索入门
hdu2101AC代码
搜索 dfs 解题代码 hdu1241
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
hdu acm 教案 动态规划(1) hdu acm 教案 动态规划(1)
ACM HDU题目分类,我自己总结的大概只有十来个吧
hdu 1166线段树代码
HDU最全ac代码
自己做的HDU ACM已经AC的题目
hdu动态规划算法集锦
hdu题目分类