poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)

LCA思想:http://www.cnblogs.com/hujunzheng/p/3945885.html

在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好的处理技巧就是在回溯到结点u的时候,u的子树已经遍历,这时候才把u结点放入合并集合中,
这样u结点和所有u的子树中的结点的最近公共祖先就是u了,u和还未遍历的所有u的兄弟结点及子树中的最近公共祖先就是u的父亲结点。以此类推。。这样我们在对树深度遍历的时候就很自然的将树中的结点分成若干的集合,两个集合中的所属不同集合的任意一对顶点的公共祖先都是相同的,也就是说这两个集合的最近公共最先只有一个。对于每个集合而言可以用并查集来优化,时间复杂度就大大降低了,为O(n + q),n为总结点数,q为询问结点对数。

 1 /*
 2     题意很明显,就是求LCA!
 3 */
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<vector>
 9 #define N 10005
10 using namespace std;
11 
12 int n;
13 int x, y;
14 vector<int>g[N];
15 int f[N];
16 int vis[N], cnt[N];
17 int ret;
18 
19 int getFather(int x){
20    return x==f[x] ? x : f[x]=getFather(f[x]);
21 }
22 
23 bool LCA(int u){
24     vis[u]=1;
25     f[u]=u;
26     int len=g[u].size();
27     
28     if(u==x && vis[y]){
29         ret=getFather(y);
30         return true;
31     }
32 
33     else if(u==y && vis[x]){
34         ret=getFather(x);
35         return true;
36     }
37 
38     for(int i=0; i<len; ++i){
39         int v=g[u][i];
40         if(!vis[v]){
41             if(LCA(v)) return true;
42             f[v]=u;
43         }
44     }
45     return false;
46 }
47 
48 int main(){
49     int t;
50     scanf("%d", &t);
51     while(t--){
52         scanf("%d", &n);
53         memset(cnt, 0, sizeof(cnt));
54         for(int i=1; i<n; ++i){
55             int u, v;
56             scanf("%d%d", &u, &v);
57             g[u].push_back(v);
58             ++cnt[v];
59         }
60         memset(vis, 0, sizeof(vis));
61         scanf("%d%d", &x, &y);
62         for(int i=1; i<=n; ++i)
63             if(cnt[i]==0){
64                 LCA(i);
65                 break;
66             }
67         printf("%d\n", ret);
68         for(int i=1; i<=n; ++i)
69             g[i].clear();
70     }
71     return 0;
72 }
73  
View Code
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<vector>
 6 #define N 905
 7 #define M 25000
 8 using namespace std;
 9 
10 vector<int>g[N];
11 vector<int>p[M];
12 int cnt[N];
13 int f[N];
14 int vis[N];
15 int ans[N];
16 
17 int n, m;
18 
19 int getFather(int x){
20    return x==f[x] ? x : f[x]=getFather(f[x]);
21 }
22 
23 void LCA(int u){
24     f[u]=u;
25     vis[u]=1;
26     int len;
27     
28     len=p[u].size();
29     for(int i=0; i<len; ++i){
30         int v=p[u][i];
31         if(vis[v])
32               ++ans[getFather(v)];
33     }
34     
35     len=g[u].size();
36     for(int i=0; i<len; ++i){
37            int v=g[u][i];
38            if(!vis[v]){
39             LCA(v);
40             f[v]=u;   
41         }
42     }
43 }
44 
45 int main(){
46       while(scanf("%d", &n)!=EOF){
47             memset(cnt, 0, sizeof(cnt));
48           for(int i=1; i<=n; ++i){
49                   vis[i]=0;
50                   ans[i]=0;
51                   int a, d, b;
52                   char ch;
53                   scanf("%d", &a);
54                   while(scanf("%c", &ch) && ch!='(');
55                   scanf("%d", &d);
56                   while(scanf("%c", &ch) && ch!=')');
57                   while(d--){
58                    scanf("%d", &b);
59                    ++cnt[b];
60                    g[a].push_back(b);
61                 }
62           }
63           scanf("%d", &m);
64           while(m--){
65                char ch;
66              while(scanf("%c", &ch) && ch!='(');
67              int u, v;
68              scanf("%d%d", &u, &v);
69              p[u].push_back(v);
70              p[v].push_back(u);
71              while(scanf("%c", &ch) && ch!=')');
72           }
73 
74           for(int i=1; i<=n; ++i)
75              if(cnt[i]==0){
76                 LCA(i);
77                 break;
78             }
79          for(int i=1; i<=n; ++i)
80             if(ans[i]!=0)
81                 printf("%d:%d\n", i, ans[i]);
82                 
83          for(int i=1; i<=n; ++i)
84             g[i].clear(), p[i].clear();
85     }
86     return 0;
87 }
View Code

 

转载于:https://www.cnblogs.com/hujunzheng/p/3945593.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LCA算法的理解

LCA思想&#xff1a;在求解最近公共祖先为问题上&#xff0c;用到的是Tarjan的思想&#xff0c;从根结点开始形成一棵深搜树&#xff0c;非常好的处理技巧就是在回溯到结点u的时候&#xff0c;u的子树已经遍历&#xff0c;这时候才把u结点放入合并集合中&#xff0c; 这样u结点…

java词汇速查手册_java 词汇表速查手册

Abstract class 抽象类:抽象类是不允许实例化的类&#xff0c;因此一般它需要被进行扩展继承。Abstract method 抽象方法:抽象方法即不包含任何功能代码的方法。Access modifier 访问控制修饰符:访问控制修饰符用来修饰Java中类、以及类的方法和变量的访问控制属性。Anonymous …

python3.5 连接mysql_python3.5 連接mysql本地數據庫

前期准備工作&#xff1a;安裝python的模塊&#xff0c;網上大部分讓安裝mysqldb模塊&#xff0c;但是會報錯&#xff0c;原因是python3.5不被其支持&#xff1a;請看該鏈接 我們也可以這樣解決&#xff1a;直接執行&#xff1a;sudo pip3 install pymysql;在python3中輸入impo…

java异常顺序_网易新闻

public class SmallT {public static void main(String args[]) {SmallT t new SmallT();int b t.get();System.out.println(b);}public int get() {try {return 1;} finally {return 2;}}}返回的结果是2。我可以通过下面一个例子程序来帮助我解释这个答案&#xff0c;从下面…

下载国外网站资料需java_Java开发必知道的国外10大网站

1、https://www.google.com/不解释2、https://stackoverflow.com里面包含各种开发遇到的问题及答案&#xff0c;质量比较高。3、https://github.com/免费的开源代码托管网站&#xff0c;包括了许多开源的项目及示例项目等。4、https://dzone.com/提供技术新闻、编程教程、及各种…

java 空数组如何判断,java判断数组是否为空

java判断数组是否为空根据数组长度判断&#xff0c;如果为0&#xff0c;则为空&#xff0c;反之不是。 (推荐学习&#xff1a;java课程)public class Main {public static void main(String[] args) {int[] array1 new int[]{}; //被当成 {0}if (array1 null) {System.out.pr…

php访问网页post获取源码,第一次抓别人网站数据,用postman直接请求可以获取到返回数据,通过代码的方式就一直报错,php...

最近需要抓取下KFC的一些数据通过postman把请求地址和参数都拿过来后可以返回数据我就天真的以为可以通过代码直接发送一个post请求即可但是通过php的curl模拟请求后&#xff0c;返回的一直是服务器异常刚开始时好像成功过&#xff0c;但现在一直都是报这个&#xff0c;我用的就…

php注册机制,php自动注册登录验证机制实现代码_PHP教程

背景&#xff1a;在phpwind站点后台添加一个名为“广告管家”(广告管家为CNZZ的一款广告投放的应用)的应用&#xff0c;整个“广告管家”的应用是通过iframe载入&#xff0c;载入的具体内容根据不同站点显示针对该站点的具体内容&#xff0c;为了提高易用性&#xff0c;有以下的…

php实现直播答题系统,直播答题解决方案

概述即构提供直播答题一站式解决方案&#xff0c;包括 Windows 主播端、移动 APP 端示例源代码(iOS、Android)。1 下载/体验地址由于直播答题场景需要主播端(推流、发题)和观众端(拉流、答题)配合使用&#xff0c;因此开发者需要同时下载这两端的软件。下载后&#xff0c;具体的…

matlab桥梁受力计算公式,matlab桥梁计算

等级&#xff1a;文件 218KB格式 pdf内容简介 该文结合斜拉桥施工监控的工程实践&#xff0c;分析研究利用MATLAB 6&#xff0e;0神经网络算法&#xff0c;可实现模式识别和函数逼近&#xff0c;进行信号处理&#xff0c;利用人工智能进行自动控制及非线性预测等。斜拉桥智能施…

2014 网选 5011 Game(Nim游戏,数学题)

/*题意&#xff1a;Nim游戏&#xff01; 思路&#xff1a;通过异或&#xff0c;判断将n个数表示成二进制的形式之后&#xff0c;是否对应位的数字1 的个数是偶数&#xff01; */ #include<iostream> using namespace std;int main(){int n, x, s;while(cin>>n){s…

先序,中序,后序线索二叉树

//后序线索&#xff0c;这种方法不容易想到 1 #include<iostream>2 #include<cstring>3 #include<cstdio>4 #include<algorithm>5 6 using namespace std;7 8 struct TREE{9 int val; 10 TREE *ch[2]; 11 TREE *thread;//该节点的线索的…

oracle的todate函数 不用英文,关于在mybaties 和 oracle的to_date函数的问题?

ITMISSD)TO_DATE使用详解时常使用to_date函数来查询特定时间内的数据。语法&#xff1a;TO_DATE(x [, format])用于将字符串x转换为时间值&#xff0c;该函数可以指定一个可选的字符串format参数来说明x的格式。如果没有指定format参数&#xff0c;日期就使用默认的数据库格式(…

oracle 字段除以1000,ORACLE常用}1000(之一)_oracle

大家在oracle的r候可能龅胶芏嗫雌聿浑y的}, 特eπ率碚f, 今天我伟阉Y一下, l布o大家, 希望Υ蠹矣助! 和大家一起探, 共同M步!     ORACLE高手碚f是不用看的. 1. Oracle安b完成后的初始口令?   internal/oracle   sys/change_on_install   system/manager   scott/…

oracle 10g rac 修改sga_target不生效,Oracle Rac 修改SGA_TARGET值无变化

Oracle Rac 修改SGA_TARGET值无变化发布时间&#xff1a;2020-08-13 23:02:13来源&#xff1a;ITPUB博客阅读&#xff1a;93作者&#xff1a;dmcatding系统&#xff1a;Red Hat Enterprise Linux Server release 6.4 (Santiago)数据库&#xff1a;Oracle 11.2.0.4.1710171、 al…

oracle表空间 设置,Oracle表空间怎么设置和管理

前言表空间是 Oracle 特有的一种逻辑结构&#xff0c;是管理和组织 Oracle 数据文件一种方式&#xff0c;一个Oracle 数据库能够有一个或多个表空间&#xff0c;而一个表空间则对应一个或多个物理的数据库文件。Oracle 的表空间分为永久空间和临时表空间&#xff0c;同时又分为…

2014 网选 5024 Wang Xifeng's Little Plot

题意&#xff1a;从任意一个任意一个可走的点开始找一个最长的路&#xff0c;这条路如果有转弯的话&#xff0c; 那么必须是 90度&#xff0c;或者没有转弯&#xff01; 思路&#xff1a; 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 &#xff01; step[i][…

Adobe InDesign各版本安装指南

下载链接 https://pan.baidu.com/s/11sTpMUbQEXhyjpkBlixcLg?pwd0531 #2024版 1.鼠标右击【Ai2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Ai2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以…

怎样永久更改嵌入式linux系统ip,如何修改嵌入式系统IP

如何修改嵌入式系统IP(2012-06-05 01:36:56)标签&#xff1a;嵌入式如何杂谈如何修改嵌入式系统IP我的嵌入式设备的根文件系统是用busybox作的&#xff0c;现在我想在程序里面更改它的IP地址等网络信息&#xff0c;但是没有找到方法&#xff0c;希望有知道的给我帮助&#xff0…

codeforces MUH and Cube Walls

题意&#xff1a;给定两个序列a ,b, 如果在a中存在一段连续的序列使得 a[i]-b[0]k, a[i1]-b[1]k.... a[in-1]-b[n-1]k 就说b串在a串中出现过&#xff01;最后输出b串在a串中出现几次&#xff01; 思路&#xff1a; KMP变形&#xff01;如何转换成KMP求解呢&#xff1f; 举一个例…