图的连通性
Tarjan算法
#include <bits/stdc++.h>
using namespace std;
int dfn[100],low[100];
bool a[100][100],v[100],f[100];
int n,t;
deque<int>node;
void tarjan(int i)
{
node.push_front(i);
t++;
dfn[i]=t;low[i]=t;
f[i]=1;
for(int j=0;j<n;j++)
if(a[i][j]==1&&!v[j])
{
if(f[j])
low[i]=min(low[i],dfn[j]);
else
{
tarjan(j);
low[i]=min(low[i],low[j]);
}
}
if(dfn[i]==low[i])
{
while(node.front()!=i)
{
cout<<node.front()<<' ';
v[node.front()]=1;
node.pop_front();
}
cout<<i<<endl;
v[i]=1;
node.pop_front();
}
}
int main()
{
int e,i,x,y;
cin>>n>>e;
for(int i=1;i<=e;i++)
{
cin>>x>>y;
a[x][y]=1;
}
//t=0;
for(i=0;i<n;i++)
if(!v[i])
tarjan(i);
return 0;
}
Kosaraju算法
#include <bits/stdc++.h>
using namespace std;
struct node
{
int v,t;
bool operator <(const node &b)const{return t>b.t;}
};
int a[100][100];
bool v[100];
node dfn[100];
int n,t;
void dfs1(int i)
{
v[i]=1;
for(int j=0;j<n;j++)
if(a[i][j]==1&&!v[j])
dfs1(j);
t++;
dfn[i].v=i;dfn[i].t=t;
}
void dfs2(int i)
{
v[i]=1;
cout<<i<<' ';
for(int j=0;j<n;j++)
if(a[j][i]==1&&!v[j])
dfs2(j);
}
int main()
{
int e,i,x,y,d;
cin>>n>>e;
for(i=1;i<=e;i++)
{
cin>>x>>y;
a[x][y]=1;
}
//t=0;
for(i=0;i<n;i++)
if(!v[i])
dfs1(i);
sort(dfn,dfn+n);
memset(v,0,sizeof(v));
for(i=0;i<n;i++)
{
if(!v[dfn[i].v])
{
dfs2(dfn[i].v);
cout<<endl;
}
}
return 0;
}