您的位置:首页 > 其它

kosaraju算法

2015-08-24 16:27 197 查看
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
bool map[100][100]; //记录图形的边
bool visited[100];  //记录点是否是被访问过了。
int dfn[100];       //记录点深度优先搜索的顺序
int dotn;           //记录点的个数
void init()         //初始化
{
cin>>dotn;
int line;
cin>>line;
for(int i=1;i<=line;i++)
{
int u,v;
cin>>u>>v;
map[u][v]=1;
}
memset(visited,0,sizeof(visited));
}
void dfsfirst(int u,int &time)  //第一次深度优先搜索记录点的dfn值
{
for(int i=1;i<=dotn;i++)
{
if(!visited[i]&&map[u][i])
{
visited[i]=1;
dfsfirst(i,time);
}
}
dfn[++time]=u;
}
void dfssecond(int u) //对图的反向图进行深搜这时候只需要判断map[dfn[i]][u]就可以了因为如果此时有边就代表了方向图中有这条边
{
for(int i=1;i<=dotn;i++)
{
if(!visited[dfn[i]]&&map[dfn[i]][u])
{
visited[dfn[i]]=1;
// cout<<dfn[i]<<" ";
dfssecond(dfn[i]);
}
}
}
void kosaraju()
{
int time=0;
for(int i=1;i<=dotn;i++)
{
if(!visited[i])
{
visited[i]=1;
dfsfirst(i,time);
}
}
cout << time <<endl;
memset(visited,0,sizeof(visited));
for(int i=dotn;i>=1;i--)
{
if(!visited[dfn[i]])
{
visited[dfn[i]]=1;
cout<<dfn[i]<<" ";
dfssecond(dfn[i]);
cout<<endl;
}
}
}
int main()
{
init();
kosaraju();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: