POJ1470 Closest Common Ancestors 【Tarjan的LCA】

非常裸的模版题,只是Tarjan要好好多拿出来玩味几次

非常有点巧妙呢,tarjan,大概就是当前结点和它儿子结点的羁绊

WA了俩小时,,,原因是,这个题是多数据的(还没告诉你T,用scanf!=EOF来控制结束),更重要的是和这个和Codeforces不一样,Codeforces的多组数据好像会又一次開始程序似的,不用在程序里面写清零,但这个题是多数据用EOF来控制输入的,多数据在一个文件中都一次输进去了,所以要memset

btw,加上一点memset代码,多了700B代码。。。

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
const int MAXN=1111;
int n;
int in[MAXN];
vector<int> G[MAXN];
int ques[MAXN][MAXN];
bool vis[MAXN];
int fa[MAXN];
int countn[MAXN];
int father(int x)
{
	if(x==fa[x])
		return x;
	return x=father(fa[x]);
}
void dfs(int x)
{
	fa[x]=x;
	for(int i=0;i<G[x].size();i++)
	{
		dfs(G[x][i]);
		fa[G[x][i]]=x;
	}
	vis[x]=true;
	for(int i=1;i<=n;i++)
	{
		if(ques[x][i]&&vis[i])
		{
			countn[father(i)]+=ques[x][i];
		}
	}
}
int main()
{
	#ifndef ONLINE_JUDGE
		freopen("G:/1.txt","r",stdin);
		freopen("G:/2.txt","w",stdout);
	#endif
	while(scanf("%d",&n)==1)
    {
        memset(ques,0,sizeof(ques));
        memset(vis,0,sizeof(vis));
        memset(fa,0,sizeof(fa));
        memset(countn,0,sizeof(countn));
        memset(in,0,sizeof(in));
        for(int i=0;i<MAXN;i++)
        {
            G[i].clear();
        }
        for(int i=1;i<=n;i++)
        {
            int x,ynum;
            scanf("%d:(%d)",&x,&ynum);
            for(int j=1;j<=ynum;j++)
            {
                int y;
                scanf(" %d",&y);
                G[x].push_back(y);
                in[y]++;
                //G[y].push_back(x);
            }
        }
            int quesnum;
            scanf(" %d",&quesnum);
            for(int i=1;i<=quesnum;i++)
            {
                int xx,yy;
                scanf(" (%d %d)",&xx,&yy);
                ques[xx][yy]++;
                ques[yy][xx]++;
            }
            for(int i=1;i<=n;i++)
            {
                if(!in[i])
                {
                    dfs(i);
                    break;
                }
            }
            for(int i=1;i<=n;i++)
            {
                if(countn[i])
                    printf("%d:%d\n",i,countn[i]);
            }
    }
    return 0;
}
时间: 2024-10-25 16:27:37

POJ1470 Closest Common Ancestors 【Tarjan的LCA】的相关文章

poj 1470 Closest Common Ancestors tarjan求lca和树的孩子兄弟表示

题意: 给一棵树和若干查询点对,求这些点对的lca. 分析: tarjan求lca的模板题,树还是用孩子兄弟表示法比较简洁. 代码: //poj 1470 //sepNINE #include <iostream> #include <vector> using namespace std; const int maxN=1024; int n,u,v,t,m,x,y;; int par[maxN],son[maxN],bro[maxN],f[maxN],cnt[maxN],vis

POJ 1330 Nearest Common Ancestors(Tarjan离线LCA)

Description A rooted tree is a well-known data structure in computer science and engineering. An example is shown below: In the figure, each node is labeled with an integer from {1, 2,...,16}. Node 8 is the root of the tree. Node x is an ancestor of

Poj1470 Closest Common Ancestors LCA

LCA裸题.. #include<iostream> #include<cstdio> #include<cstring> #include<map> #include<vector> using namespace std; const int maxn = 1111; int head[maxn]; int len; struct Node { int to; int next; }e[maxn * 2]; int father[maxn];

poj 1470 Closest Common Ancestors 【Tarjan 离线 LCA】

题目:poj 1470 Closest Common Ancestors 题意:给出一个树,一些询问.求LCA的个数. 分析:很简单的模板题目,但是模板不够优秀,一直wa...RE,各种错误一下午,终于发现自己模板的漏洞了. AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; #define N 1010 #

POJ 1470 Closest Common Ancestors LCA题解

本题也是找LCA的题目,不过要求多次查询,一般的暴力查询就必然超时了,故此必须使用更高级的方法,这里使用Tarjan算法. 本题处理Tarjan算法,似乎输入处理也挺麻烦的. 注意: 因为查询的数据会极大,故此使用一个数组记录所有查询数据就会超时的.我就载在这里了.查了好久才想到这点.因为我使用了一个vector容器记录了查询数据,故此每次都循环这组这么大的数据,就超时了.----解决办法:使用一个vector<int> quest来记录查询数组,这样每次都只需要循环某节点的邻接查询点就可以了

POJ 1470 Closest Common Ancestors【最近公共祖先LCA】

题目链接:http://poj.org/problem?id=1470 题目大意:给出一棵树,再给出若干组数(a,b),输出节点a和节点b的最近公共祖先(LCA) 就是很裸的LCA,但是我用的是<挑战程序设计竞赛>上的"基于二分搜索的算法求LCA",我看网上用的都是tarjan算法.但是我的代码不知道为什么提交上去 wrong answer,自己想的很多测试数据也都和题解结果一样,不知道错在哪里,所以把代码保存一下,留待以后解决...... 如果读者有什么建议,希望提出来,

POJ 1470 Closest Common Ancestors 【LCA】

任意门:http://poj.org/problem?id=1470 Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 22519   Accepted: 7137 Description Write a program that takes as input a rooted tree and a list of pairs of vertices. For each pa

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

Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 15446   Accepted: 4944 Description Write a program that takes as input a rooted tree and a list of pairs of vertices. For each pair (u,v) the program determines the

POJ 题目1470 Closest Common Ancestors(LCA)

Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 16671   Accepted: 5319 Description Write a program that takes as input a rooted tree and a list of pairs of vertices. For each pair (u,v) the program determines the