hdoj 4714 将树转换为环
来源:互联网 发布:c语言常用函数大全 编辑:程序博客网 时间:2024/05/22 17:35
比赛的时候想到的思路为:对于一个节点的度数超过n,如果其超过2,那么肯定是要减去n-2条边的,至于怎样去删边,那就删去其相连的度数较大的节点边,以贪心的思想,自我感觉删去一条边最大可以使两个节点的值更接近于要求就是最大的,结果wa了,后来给钢牛讲了思路,他也觉得挺对的,但是还是错的。。。今天下午和ac的程序出数据在对,最后终于发现算法错在哪里了。因为我觉得只要删边就删节点度数最大的点,但是这里不是随意的,而是删边对下面有影响的,找了块一个下午的bug。
正确思路:对树进行搜索,对于以s为根的子树,如果其叶子节点为sum,如果其小于2的话,则为s的根节点的叶子的总数贡献为1,而s节点就不用进行减边操作了,如果sum大于2的话,那么s节点则应该删除sum-1条边(假设s不为树的根),删除其与父节点的根和其子女中的sum-2个,然后对父节点的贡献为0,如果删除的是其子女中的sun-1条边儿而不删除其与父节点的边,那么其删除的边相同并且还给父节点贡献了一个1,显然不是最小的。
对求的边乘2+1就是结果了!!!!
下面是代码:
#pragma comment(linker,"/STACK:1024000000,1024000000") #include <cstdio>#include <cstdlib>#include <climits>#include <cstring>#include <cmath>#include <algorithm>#include<iostream>#include<queue>#include <map>using namespace std;typedef long long ll;#define INF (INT_MAX/10)#define SQR(x) ((x)*(x))#define rep(i, n) for (int i=0; i<(n); ++i)#define repf(i, a, b) for (int i=(a); i<=(b); ++i)#define repd(i, a, b) for (int i=(a); i>=(b); --i)#define clr(ar,val) memset(ar, val, sizeof(ar))#define N 1000005struct node{int y,pre;};node a[N*2];int n,len;int pre[N];int ans;void addpage(int s,int t){a[len].pre=pre[s];a[len].y=t;pre[s]=len++;}int dfs(int s,int fa){int sum=0;for(int i=pre[s]; i!=-1; i=a[i].pre){int y=a[i].y;if(y==fa) continue;sum+=dfs(y,s);}if(sum<2){return 1;}else{ if(s==1) ans+=sum-2;elseans+=sum-1;return 0;}}int main(){int test;scanf("%d",&test);int x,y;while(test--){scanf("%d",&n);len=1;memset(pre,-1,sizeof(pre));rep(i,n-1)scanf("%d%d",&x,&y),addpage(x,y),addpage(y,x);ans=0;dfs(1,-1);cout<<ans*2+1<<endl;}return 0;}
- hdoj 4714 将树转换为环
- 将中缀表达式转换为表达式树
- 将二进制转换为整数,将十六进制转换为整数
- 将回车转换为TAB
- 将结构转换为数组
- 将图片转换为Icon
- 将图片转换为bytes
- 将HEX转换为String
- 将pdf转换为word
- 将汉字转换为拼音
- 将字符串转换为数值
- 将IplImage转换为DIB
- 将繁体字转换为简体
- 将阿拉伯数字转换为罗马数字
- 将阿拉伯数字转换为罗马数字
- 将负数转换为二进制
- 将Telnet转换为ssh
- 将负数转换为二进制
- Ubuntu 将应用程序添加到启动器
- 设计模式之——单例模式(Singleton)的常见应用场景
- 学好java方法
- maven环境搭建
- 数据库之表格的结构的更改以及数据的增、删、插、改
- hdoj 4714 将树转换为环
- ios开发 把视频文件和图片保存到相册
- c#图片比对
- 开源手游暗黑世界客户端部分代码注解续
- Json,Gson,FastJson解析笔记
- opencv的highgui显示ffmpeg的数据
- Java对象创建与销毁
- ABAP屏幕开发 - 设计折叠样式的屏幕(类似MIGO或ME23N的屏幕)
- WebService知识点总结