题目链接: Anton and Tree

题意:给出一棵树由0和1构成,一次操作可以将树上一块相同的数字转换为另一个(0->1 , 1->0),求最少几次操作可以把这棵数转化为只有一个数字的一棵数。

题解:首先一次可以改变一片数字,那么进行缩点后就变成了每次改变一个点。缩完点后这棵数变成了一棵相邻节点不同,0和1相交叉的一棵树。然后一棵树的直径上就是

这种情况,相当于从中间开始操作,总共操作(L+1)/2次。关于其他的分支一定会在直径的改变过程中完成改变。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAX_N = 2e5+;
  4. const long long INF = 1e9+;
  5. typedef pair<int,int> P;
  6. int N,M,T;
  7. vector<P> V;
  8. int dir[MAX_N];
  9. int vec[MAX_N];
  10. int father[MAX_N];
  11. int vis[MAX_N];
  12. vector<int> tran[MAX_N];
  13. int start,deep;
  14. void init(){
  15. for(int i=;i<MAX_N;i++){
  16. dir[i] = i;
  17. tran[i].clear();
  18. vis[i] = ;
  19. }
  20. V.clear();
  21. start = -;
  22. deep = ;
  23. }
  24. int find_f(int x){
  25. if(x == dir[x]) return x;
  26. return dir[x] = find_f(dir[x]);
  27. }
  28. void bfs(int pos,int deepth){
  29. if(deepth > deep){
  30. deep = deepth;
  31. start = pos;
  32. //cout<<"....."<<deepth<<endl;
  33. }
  34. vis[pos] = ;
  35. for(int i=;i<tran[pos].size();i++){
  36. if(!vis[tran[pos][i]]) bfs(tran[pos][i],deepth+);
  37. }
  38. return ;
  39. }
  40. int main()
  41. {
  42. while(cin>>N){
  43. init();
  44. for(int i=;i<=N;i++){
  45. scanf("%d",&vec[i]);
  46. }
  47. for(int i=;i<N-;i++){
  48. int a,b;
  49. scanf("%d%d",&a,&b);
  50. int fa = find_f(a);
  51. int fb = find_f(b);
  52. if(vec[fa] == vec[fb] ) dir[fb] = dir[fa];
  53. else V.push_back(P(fa,fb));
  54. }
  55. for(int i=;i<=N;i++){
  56. father[i] = find_f(i);
  57. }
  58. for(int i=;i<V.size();i++){
  59. P p = V[i];
  60. //cout<<father[p.first]<<"...."<<father[p.second]<<endl;
  61. tran[father[p.first]].push_back(father[p.second]);
  62. tran[father[p.second]].push_back(father[p.first]);
  63. start = father[p.first];
  64. }
  65. if(start == -) {
  66. cout<<<<endl;
  67. }
  68. else{
  69. bfs(start,);
  70. deep = ;
  71. for(int i=;i<=N;i++) vis[i] = ;
  72. bfs(start,);
  73. cout<<(deep+)/<<endl;
  74. }
  75.  
  76. }
  77. return ;
  78. }
  79. /*
  80.  
  81. */

Codeforces 734E Anton and Tree(缩点+树的直径)的更多相关文章

  1. Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 树的直径

    传送门 题意: 这道题说的是在一颗有两种颜色的树上,每操作一个节点,可以改变这个节点颜色和相邻同色节点的颜色.问最少操作次数,使得树上颜色相同. 思路: 先缩点,把相同的颜色的相邻节点缩在一起.再求出 ...

  2. Codeforces 734E. Anton and Tree 搜索

    E. Anton and Tree time limit per test: 3 seconds memory limit per test :256 megabytes input:standard ...

  3. CodeForces 734E Anton and Tree

    $dfs$缩点,树形$dp$. 首先将连通块缩点,缩点后形成一个黑白节点相间的树.接下来的任务就是寻找一个$root$,使这棵树以$root$为根,树的高度是最小的(也就是一层一层染色).树形$dp$ ...

  4. Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径

    E. Anton and Tree 题目连接: http://codeforces.com/contest/734/problem/E Description Anton is growing a t ...

  5. Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路

    题目链接:http://codeforces.com/contest/734/problem/E E. Anton and Tree time limit per test 3 seconds mem ...

  6. codeforces GYM 100114 J. Computer Network tarjan 树的直径 缩点

    J. Computer Network Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Des ...

  7. codeforces GYM 100114 J. Computer Network 无相图缩点+树的直径

    题目链接: http://codeforces.com/gym/100114 Description The computer network of “Plunder & Flee Inc.” ...

  8. HDU4612 Warm up 边双(重边)缩点+树的直径

    题意:一个连通无向图,问你增加一条边后,让原图桥边最少 分析:先边双缩点,因为连通,所以消环变树,每一个树边都是桥,现在让你增加一条边,让桥变少(即形成环) 所以我们选择一条树上最长的路径,连接两端, ...

  9. hdu 4612 Warm up 有重边缩点+树的直径

    题目链接 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tot ...

随机推荐

  1. 使用ES6+Vue+webpack+gulp构建新一代Web应用

    1.推荐学习网站:Vue.js中国 2.Demo环境搭建: 2.1环境配置 安装nodejs环境,具体内容可以百度: 新建一个文件夹: mkdir VUE-ES6-WebPack 全局安装gulp: ...

  2. 解决IE下select option不支持display none样式

    万恶的IE,option竟然不支持display样式,想到的解决思路有二个: 1.ajax联动查询 2.jQuery的remove().after()方法 方法1的不好之处是初始页面,需要显示全部IP ...

  3. DataContract和DataMember的作用

    数据契约(DataContract)里的DataMember特性  来源于网络,用于个人收集及备忘 数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端 ...

  4. Oracle EBS OM 发放订单

    DECLARE l_header_rec OE_ORDER_PUB.Header_Rec_Type; l_line_tbl OE_ORDER_PUB.Line_Tbl_Type; l_action_r ...

  5. Linux磁盘及分区之wwid和uuid

    背景描述,在Linux系统中,如果添加了新的SCSI磁盘或者映射SAN存储LUN操作,重启操作系统之后会出现磁盘标识符(sd*)错乱的情况. 例如之前添加的SAN存储LUN的磁盘标识符为/dev/sd ...

  6. linux stat 简单介绍

    stat 命令查看文件或文件系统的状态时间等属性 用法:stat [参数]... 文件... 简单的介绍一下stat命令显示出来的文件其他信息: - File:显示文件名 - Size:显示文件大小 ...

  7. python的学习之路day6

    大纲: 1.反射 其中的方法:getattr,delattr,setattr,hasattr __import__() __import__() 注意事项 2.模块中的特殊变量 __doc__ __c ...

  8. 【转】MySQL双主一致性架构优化

    [原文]https://www.toutiao.com/i6594414914838725133/ 一.双主保证高可用 MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能 ...

  9. 再谈全局网HBase八大应用场景

    摘要: HBase可以说是一个数据库,也可以说是一个存储.拥有双重属性的HBase天生就具备广阔的应用场景.在2.0中,引入了OffHeap降低了延迟,可以满足在线的需求.引入MOB,可以存储10M左 ...

  10. 利用Chrome浏览器的开发者工具截取整个页面

    ①打开Chrome浏览器的开发者工具: 快捷键: command + Alt + I (Mac). Ctrl + shift + I (Windows) 或者: 鼠标右键 -> 弹出菜单中选择 ...