SOJ 1187 最近公共祖先 LCA

本文详细介绍了离线tarjan算法的实现过程,包括头文件的引用、变量定义、函数实现以及算法流程。通过实例代码,展示了如何使用tarjan算法解决实际问题。

 

依然是离线的tarjan算法

不好理解啊不好理解

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#define inf 0x7fffffff
using namespace std;

#define maxv 10010

vector<int> vec1[maxv],vec2[maxv];
bool color[maxv];
int fa[maxv];
int ind[maxv];
int ans[maxv];
int find(int x)
{
  if(x!=fa[x])
  fa[x]=find(fa[x]);
  return fa[x];
}
void uion(int x,int y)
{
    fa[find(y)]=find(x);
}
void tarjan(int u)
{
     int i;
     for(i=0;i<vec1[u].size();i++)
     {
       int son=vec1[u][i];
       tarjan(son);
       uion(u,son);
       
     }
     color[u]=1;
     for(i=0;i<vec2[u].size();i++)
     {
       int v=vec2[u][i];
       if(color[v]==1)
         ans[find(v)]++;
     }
     return;
}

int main()
{
    int i,j,k,n,m;
    while(scanf("%d",&n)==1)
    {
       for(i=0;i<=n;i++)
       {
         vec1[i].clear();
         vec2[i].clear();
       }
       memset(color,0,sizeof(color));
       memset(ans,0,sizeof(ans));
       memset(ind,0,sizeof(ind));
       int a,b;
       for(j=0;j<n;j++)
       {
       scanf("%d:(%d)",&a,&m);
       for(i=0;i<m;i++)
       {
         scanf("%d",&b);
         vec1[a].push_back(b);
         ind[b]++;
       }
       }
       scanf("%d\n",&k);
       for(i=0;i<k;i++)
       {
          scanf("(%d,%d)",&a,&b);
          getchar();
          vec2[a].push_back(b);
          vec2[b].push_back(a);
       }
       for(i=0;i<=n;i++)
       fa[i]=i;
       for(i=1;i<=n;i++)
       {
       if(ind[i]==0)
       {
         tarjan(i);
         break;
       }
       }
       for(i=1;i<=n;i++)
       {
         if(ans[i]!=0)
         printf("%d:%d\n",i,ans[i]);
       }
    }
    return 0;
}
             
       
       
         
       




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值