poj 1470 | zoj 1141 Closest Common Ancestors

原创 2012年03月23日 18:39:51

类型:LCA

题目:http://poj.org/problem?id=1470

来源:Southeastern Europe 2000

思路:使用LCA算法求最近公共祖先,并记录个数

// poj 1470 Closest Common Ancestors
// OLE AC 2956K	563MS
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

#define FOR(i,a,b) for(i = (a); i < (b); ++i)
#define FORE(i,a,b) for(i = (a); i <= (b); ++i)
#define FORD(i,a,b) for(i = (a); i > (b); --i)
#define FORDE(i,a,b) for(i = (a); i >= (b); --i)
#define CLR(a,b) memset(a,b,sizeof(a))
#define PB(x) push_back(x)

const int MAXN = 1100;
const int MAXM = 210000;

bool vis[MAXN];
int cnt, cntt, n;
int head[MAXN], p[MAXN], ru[MAXN], ancestor[MAXN], endd[MAXN];
vector<int> q[MAXN];
struct edge {
    int v, nxt;
}e[MAXM];

void addedge(int u, int v) {
    e[cnt].v = v;
    e[cnt].nxt = head[u];
    head[u] = cnt++;
}

void makeSet() {
	for(int i = 1; i <= n; ++i)
		p[i] = i;
}

int find(int u) {
	return (u != p[u]) ? (p[u] = find(p[u])) : p[u];
}

void link(int x, int y) {
    p[x] = y;
}

void LCA(int u) {
    int v, i;

    ancestor[u] = u;
    for(i = head[u]; i != -1; i = e[i].nxt) {
        v = e[i].v;
        LCA(v);
        link(find(v), find(u));
        ancestor[find(u)] = u;
    }
    vis[u] = true;
    int size = q[u].size();
    FOR(i, 0, size)
        if(vis[q[u][i]])
            ++endd[ancestor[find(q[u][i])]];
}

void init() {
    int i;

    CLR(head, -1);
    CLR(p, 0);
    CLR(endd, 0);
    CLR(ru, 0);
    CLR(ancestor, 0);
    CLR(vis, false);
    cnt = cntt = 0;
    //!!!
    makeSet();
    FORE(i, 1, n)
        q[i].clear();
}

int main() {
    int i, j, u, v, num;

    while(scanf("%d", &n) != EOF) {
        init();
        FORE(i, 1, n) {
            scanf("%d:(%d)", &u, &num);
            FOR(j, 0, num) {
                scanf("%d", &v);
                addedge(u, v);
                ++ru[v];
            }
        }
        scanf("%d", &num);
        FORE(j, 1, num) {
            scanf(" (%d %d)", &u, &v);
            q[u].push_back(v);
            q[v].push_back(u);
        }
        FORE(i, 1, n) if(ru[i] == 0) {
            LCA(i);
            break;
        }
        FORE(i, 1, n) if(endd[i] != 0)
            printf("%d:%d\n", i, endd[i]);
    }
    return 0;
}




POJ 1470 Closest Common Ancestors 采用树结构的非线性表编程

A - Closest Common Ancestors(8.4.9) Time Limit:2000MS     Memory Limit:10000KB     64bit IO Format:%...
  • zp___waj
  • zp___waj
  • 2015年08月25日 20:11
  • 497

(算法)Tarjan离线算法解决LCA问题 (附POJ 1470 Closest Common Ancestors 代码)

分类: 算法整理2011-07-15 22:25 1335人阅读 评论(0) 收藏 举报 算法cini        对于最近公共祖先问题,我们先来看这样一个性质,当两个节点(u,v)...
  • pi9nc
  • pi9nc
  • 2013年06月26日 21:55
  • 517

POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一、基本算法:        (1)枚举 (1753,2965)  ...
  • dg357442101
  • dg357442101
  • 2016年03月13日 14:24
  • 3485

poj 1470 Closest Common Ancestors 【并查集 求根 + 求解每一个节点是多少对(a,b)的LCA】

Closest Common Ancestors Time Limit: 2000MS   Memory Limit: 10000K Total Submissions...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015年08月10日 10:01
  • 330

POJ, 1330 Nearest Common Ancestors(找出两个节点最近的公共节点——BFS)

Problem B : Nearest Common Ancestors From:POJ, 1330 Description A rooted tree is a well-known...
  • Hush_lei
  • Hush_lei
  • 2014年07月30日 15:30
  • 525

区间dp模型之括号匹配打印路径 poj(1141)

题目链接:Brackets Sequence 题目描述:给出一串由‘(‘)’‘ [ ' ' ] '组成的串,让你输出添加最少括号之后使得括号匹配的串。 分析:是区间dp的经典模型括...
  • y990041769
  • y990041769
  • 2014年04月21日 11:10
  • 2597

[POJ3415]Common Substrings(后缀数组+单调栈)

题目描述传送门 题意:给定两个字符串 A 和 B ,求长度不小于 k 的公共子串的个数(可以相同)。题解首先把一个串接在另一个串的后面,中间放一个没出现过的字符。 由于每一个子串都是某一个后缀的前...
  • Clove_unique
  • Clove_unique
  • 2016年12月26日 21:20
  • 629

POJ1141 Brackets Sequence (最小括号匹配升级版:区间DP+打印路径)

Link:http://poj.org/problem?id=1141 Brackets Sequence Time Limit: ...
  • Enjoying_Science
  • Enjoying_Science
  • 2015年10月11日 14:01
  • 564

【POJ】3415 Common Substrings 【后缀数组+单调栈】

传送门:【POJ】3415 Common Substrings 题目分析: 题目要求的实质是计算 A 的所有后缀和 B 的所有后缀之间的最长公共前缀的长度,然后把最长公共前缀长度不小于...
  • u013368721
  • u013368721
  • 2014年12月10日 21:43
  • 976

poj 1141 括号匹配

根据“黑书”的思路,定义: d[i][j]为输入序列从下标i到下标j最少需要加多少括号才能成为合法序列。0...
  • u013076044
  • u013076044
  • 2014年12月28日 21:32
  • 609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 1470 | zoj 1141 Closest Common Ancestors
举报原因:
原因补充:

(最多只允许输入30个字)