【题意】

给出一棵树和多组查询,求以每个节点为LCA的查询数有多少?

【错误点】

①读入的时候,注意它的空格是随意的呀!一开始不知道怎么弄,后来看了DISCUSS区大神的话:

询问部分输入:

scanf("%d",&m);
for(int i=0;i<m;i++){
scanf(" (%d %d)",&a,&b);
}

注意scanf(" 这里有一个空格

②多组数据啊!注意这句话:
The input file contents several data sets (at least one).

③痛心疾首!它问的是以每个节点为LCA的查询数,所以查询可以重复,同样的查询可以累计!

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int MAXN=+;
vector<int> E[MAXN];
int query[MAXN][MAXN];
int cnt[MAXN];
int notrt[MAXN],rt;
int ance[MAXN];
int vis[MAXN];
int m;//结点的总个数 int find(int u)
{
int r=u;
while (ance[r]!=r) r=ance[r];
int ans=r;
r=u;
while (ance[r]!=r)
{
int tmp=ance[r];
ance[r]=ans;
r=tmp;
}
return ans;
} void tarjan(int u)
{
vis[u]=;
for (int v=;v<=m;v++)
{
if (!query[u][v]) continue;
if (vis[v])
//被访问过有两种情况:一是祖先靠左的子树中的后代;或者是自己的祖先。两者的LCA均为v所在并查集的根
{
int LCA=find(v);
cnt[LCA]+=query[u][v];
//注意,允许同样的查询出现多次,并且同样的查询可以累计!
}
} ance[u]=u;
for (int i=;i<E[u].size();i++)
{
int v=E[u][i];
tarjan(v);
ance[v]=u;
}
} void init()
{
memset(query,,sizeof(query));
memset(cnt,,sizeof(cnt));
memset(notrt,,sizeof(notrt));
memset(vis,,sizeof(vis));
for (int i=;i<=m;i++) E[i].clear();
for (int i=;i<m;i++)
{
int p,T;
scanf("%d:(%d)",&p,&T);
for (int i=;i<T;i++)
{
int son;
scanf(" %d",&son);
E[p].push_back(son);
notrt[son]++;
}
} int n;
scanf("%d",&n);
for (int i=; i<n; i++)
{
int a,b;
scanf(" (%d %d)",&a,&b);
//注意这里(前面要有一个空格!否则无法过!
query[a][b]++;
query[b][a]++;
} for (int i=;i<=m;i++) if (!notrt[i])
{
rt=i;
break;
}
} void print()
{
for (int i=;i<=m;i++)
if (cnt[i]>)
cout<<i<<':'<<cnt[i]<<endl;
} int main()
{
while (~scanf("%d",&m))
//注意是多组数据
{
init();
tarjan(rt);
print();
}
return ;
}

【LCA/tarjan】POJ1470-Closest Common Ancestors的更多相关文章

  1. poj1470 Closest Common Ancestors [ 离线LCA tarjan ]

    传送门 Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 14915   Ac ...

  2. POJ1470 Closest Common Ancestors 【Tarjan的LCA】

    非常裸的模版题,只是Tarjan要好好多拿出来玩味几次 非常有点巧妙呢,tarjan,大概就是当前结点和它儿子结点的羁绊 WA了俩小时,,,原因是,这个题是多数据的(还没告诉你T,用scanf!=EO ...

  3. POJ 1470 Closest Common Ancestors【LCA Tarjan】

    题目链接: http://poj.org/problem?id=1470 题意: 给定若干有向边,构成有根数,给定若干查询,求每个查询的结点的LCA出现次数. 分析: 还是很裸的tarjan的LCA. ...

  4. POJ1470 Closest Common Ancestors

    LCA问题,用了离线的tarjan算法.输入输出参考了博客http://www.cnblogs.com/rainydays/archive/2011/06/20/2085503.htmltarjan算 ...

  5. POJ 1470 Closest Common Ancestors 【LCA】

    任意门:http://poj.org/problem?id=1470 Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000 ...

  6. POJ 1470 Closest Common Ancestors (LCA,离线Tarjan算法)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 13372   Accept ...

  7. POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)

    POJ 1470 Closest Common Ancestors(最近公共祖先 LCA) Description Write a program that takes as input a root ...

  8. POJ 1470 Closest Common Ancestors (LCA, dfs+ST在线算法)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 13370   Accept ...

  9. poj----(1470)Closest Common Ancestors(LCA)

    Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 15446   Accept ...

随机推荐

  1. datagrid导出数据

    //导出excel public function touzi_doExport() { $search=$_POST['search']; //接受前端传过来的数据 $this->succes ...

  2. react 修改state某一属性值

    1.state // 筛选框相关数据 searchSelect: { term: { value: '学期', key: '', options: [] }, type_of_personnel: { ...

  3. c语言学习笔记.指针.

    指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...

  4. thinkphp搜索排序

  5. 五. Jmeter--HTTP Cookie Manager

    1. 添加HTTP Cookie Manager 2.添加登录login http,request info 和 HTTP Header Manager 中的信息是从fiddler中拿的, 至于hea ...

  6. Thinkphp的CURD

    CURD即(Create Update Read Delete)其实也就是等同于增删改查. C:Create 创建数据  对数据的添加 Create$m=new Model('User');$m=M( ...

  7. 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)

    浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...

  8. 85.Maximal Rectangle---dp

    题目链接:https://leetcode.com/problems/maximal-rectangle/description/ 题目大意:给出一个二维矩阵,计算最大的矩形面积(矩形由1组成).例子 ...

  9. UVA 1103 How Many O's?

    题目链接:UVA-11038 题意为给定n和m,求n和m之间(包含)的所有数包含的0的个数. 思路是,用cal(x)表示小于等于x的数包含的0的个数.则答案为cal(n)-cal(m-1). 再把求c ...

  10. HDU 6194 string string string 2017沈阳网络赛 后缀数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6194 题意:告诉你一个字符串和k , 求这个字符串中有多少不同的子串恰好出现了k 次. 解法:后缀数组 ...