您的位置:首页 > 其它

强连通分量(tarjan算法)

2014-04-29 09:22 281 查看
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#define max 110
using namespace std;
int par[max],in[max],out[max];
int low[max],dnf[max],sta[max],ccount,tot,cnt;//ccount为强连通分量个数
bool use[max];
vector<int >g[max];
int mmax(int a,int b)
{
int p;
if(a>b)
p=a;
else
p=b;
return p;
}
void dfs(int index)
{
int i,p,k;
low[index]=dnf[index]=++cnt;
use[index]=1;
sta[tot++]=index;
p=(int)g[index].size();
for(i=0;i<p;i++)
{
k=g[index][i];
if(!dnf[k])
{
dfs(k);
if(low[index]>low[k])
low[index]=low[k];
}
else if(use[k])
{
if(low[index]>dnf[k])
low[index]=dnf[k];
}
}
if(low[index]==dnf[index])
{
ccount++;
while(1)
{
tot--;
use[sta[tot]]=0;
par[sta[tot]]=ccount;
if(tot==0||sta[tot]==index)
break;
}
}
return ;
}
void targin(int n)
{
memset(use,0,sizeof(use));
memset(dnf,0,sizeof(dnf));
memset(low,0,sizeof(low));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
cnt=0;
ccount=0;
tot=0;
int i,s=0,j,q;
int p,t;
for(i=1;i<=n;i++)
{
if(!dnf[i])
dfs(i);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: