http://poj.org/problem?id=1330&&大水货一个啊

11 篇文章 0 订阅


LCA纯版题,各种调试不成功,砸电脑的心都有了;撞墙去了恶心死了;

更恶心的是vs2010报错:sbIDE 

#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=10010;
#define CLR(arr,val) memset(arr,val,sizeof(arr))
int n,father[MAX],rank[MAX],ancestors[MAX],Indegree[MAX];
vector<int> Adj[MAX],temp[MAX];
bool visited[MAX];
void Init()
{   for(int i=0;i<MAX;i++)
    {   father[i]=i;
        Adj[i].clear();
        temp[i].clear();
    }
    fill(rank,rank+MAX,1);    
    CLR(visited,false);
}
int Find(int u)
{   return father[u]==u?u:father[u]=Find(father[u]);
}
void Union(int u,int v)
{   u=Find(u);
    v=Find(v);
    if(u==v) return ;
     father[v]=u;
}
void LCA(int u)
{   ancestors[u]=u;//设定自己为祖先
    for(vector<int>::size_type i=0;i<Adj[u].size();i++) 
    {   LCA(Adj[u][i]);//DFS
        Union(u,Adj[u][i]);
        ancestors[Find(u)]=u;
    }
    visited[u]=true;
    for(vector<int>::size_type i=0;i<temp[u].size();i++)
    {   if(visited[temp[u][i]])
           cout<<ancestors[Find(temp[u][i])]<<endl; 
    }
}
int main()
{   int k,u,v;
    scanf("%d",&k);
    while(k--)
    {   scanf("%d",&n);
        Init();
        for(int i=0;i<n-1;i++)
        {   scanf("%d%d",&u,&v);
            Adj[u].push_back(v);
            Indegree[v]++;
        }
        scanf("%d%d",&u,&v);
        temp[u].push_back(v);
        temp[v].push_back(u);
        for(int i=1;i<=n;i++)
            if(!Indegree[i]) 
            {   LCA(i);//找到树根 
                break; 
            }     
    }
    return 0;
}
/*
 1 3
 1 4
 3 6
 3 5
 5 2
 4 8
 4 7
 1 3
 3 4
 5 6
 4 6
 2 7
 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值