(算法)Tarjan离线算法解决LCA问题 (附POJ 1470 Closest Commo

/*author UESTC_Nowitzki */#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>#include <vector>using namespace std;const int MAX=1000;int indegree[MAX];int ancestor[MAX];int set[MAX];int vis[MAX];int time[MAX];vector<int> adj[MAX];vector<int> que[MAX];void init(int n){memset(time,0,sizeof(time));memset(vis,0,sizeof(vis));memset(indegree,0,sizeof(indegree));for(int i=1;i<=n;i++){adj[i].clear();que[i].clear();set[i]=i;ancestor[i]=i;}}int find(int k){int r=k;while(set[r]!=r)r=set[r];int i=k,j;while(set[i]!=r){j=set[i];set[i]=r;i=j;}return r;}void dfs(int i){int len=adj[i].size();for(int j=0;j<len;j++){int son=adj[i][j];dfs(son);set[son]=i;ancestor[find(i)]=i;}vis[i]=1;len=que[i].size();for(int j=0;j<len;j++){int son=que[i][j];if(vis[son]){int ans=ancestor[find(son)];time[ans]++;}}}int main(){int n,i,t,a,b;while(scanf("%d",&n)!=EOF){init(n);for(i=0;i<n;i++){scanf("%d:(%d)",&a,&t);while(t–){scanf("%d",&b);indegree[b]++;adj[a].push_back(b);}}scanf("%d",&t);while(t–){while(getchar()!='(‘);scanf("%d%d",&a,&b);que[a].push_back(b);que[b].push_back(a);}while(getchar()!=’)’);for(i=1;i<=n;i++){if(indegree[i]==0){ //printf("root=%d\n",i);dfs(i);break;}}for(i=1;i<=n;i++){if(time[i]>0)printf("%d:%d\n",i,time[i]);}}return 0;}

,世上没有绝望的处境,只有对处境绝望的人。

(算法)Tarjan离线算法解决LCA问题 (附POJ 1470 Closest Commo

相关文章:

你感兴趣的文章:

标签云: