HDU 4714 Tree2cycle
2024-10-18 04:14:33
dfs
不是根节点:如果边数大于等于2,则删除与父节点的边。并且是一条环,那么每个点的度数是2,则还要删除num(每个节点儿子数)-2,只留两个儿子。当然删除边的儿子也要连到环上,又是一个num(每个节点儿子数)-2次操作。最后不同分支之间还要连一条边。所以复杂度为:2*(num-1)。
根:不用删父亲边和连分支边。2*(num-2)
注意本题要手动扩栈
#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
#include<vector>
#include<malloc.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int N=;
#define LL long long
const double eps = 1e-;
const double pi = acos(-);
// inline int r(){
// int x=0,f=1;char ch=getchar();
// while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
// while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
// return x*f;
// }
vector<int>g[];
int ans;
int vis[];
int dfs(int u){
int num=;
vis[u]=true;
for(int i=;i<g[u].size();i++){
int v=g[u][i];
if(vis[v]==){
num+=dfs(v);
}
}
if(num>=){
if(u==){
ans+=*(num-);
}
else
ans+=*(num-);
return ;
}
else
return ;
}
int main(){
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
ans=;
int n;
clc(vis,);
scanf("%d",&n);
for(int i=;i<=n;i++) g[i].clear();
for(int i=;i<n-;i++){
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}
int num=dfs();
printf("%d\n",++ans);
}
return ;
}
最新文章
- 特定IP访问远程桌面
- dos常用命令
- VI编辑器
- centos7的网络配置以及设置主机名和绑定IP的问题
- php规范
- Java中的volatile
- swift-01-利用元组判断字符串出现次数
- FFTW程序Demo
- Maven包装过程中跳过测试
- 使用Post方法模拟登陆爬取网页
- Struts配置的各种视图转发类型
- 毕业论文内容框架指导-适用于MIS系统
- HTML结构及基础语法
- 微信小程序开发用户授权登录
- Mac+Docker环境下xdebug的配置
- asp.net core 2.0 cookie的使用
- js prototype分析
- JMeter学习(三十六)发送HTTPS请求(转载)
- H5新增语义化标签
- ES6 学习笔记之三 函数参数默认值
热门文章
- PAT-乙级-1045. 快速排序(25)
- 团体程序设计天梯赛-练习集L2-010. 排座位
- Scala的Pattern Matching Anonymous Functions
- c/c++强制类型转换
- Firefly Http通信简单介绍
- URAL 1260 Nudnik Photographer(递推)
- CodeForces 299A	 Ksusha and Array
- PreparedStatement是如何大幅度提高性能的
- 李洪强漫谈iOS开发[C语言-011] - C语言标示符
- POJ2993——Help Me with the Game(字符串处理+排序)