http://poj.org/problem?id=1330&&大水货一个啊
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 */