kosaraju算法

来源:互联网 发布:2015十大网络歌曲 编辑:程序博客网 时间:2024/06/03 20:03
#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;}

0 0
原创粉丝点击