Kosaraju's Two-Pass Algorithm for SCC

来源:互联网 发布:大数据主要做什么 编辑:程序博客网 时间:2024/06/01 07:53

note:

1、g++ -o xxx.exe xxx.cpp -Wl,--stack -Wl,0x1000000  设置栈大小


#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<fstream>#include<map>using namespace std;//#pragma comment(linker, "/STACK:204800000,204800000")vector<int> e[955555],ee[955555];int f[955555],l[955555],g[955555];vector<int> vc;map<int,int> mp;bool vis[955555];int col;int abc;int cnt=0;void dfs1(int u){    int i;    vis[u]=true;    for(i=0;i<ee[u].size();++i)    {        if(!vis[ee[u][i]])            dfs1(ee[u][i]);    }    f[u]=abc;    ++abc;    return ;}void dfs2(int u){    int i;    vis[u]=true;    l[u]=col;    for(i=0;i<e[u].size();++i)    {        if(!vis[e[u][i]])            dfs2(e[u][i]);    }    return ;}ifstream fin("SCC.txt");int main(){//    freopen("SCC.txt","r",stdin);    int u,v,n=9,i,j;    int fk1=-1,fk2=0;//    while(cin>>u>>v)//    while(scanf("%d %d",&u,&v)!=EOF)    while(fin>>u>>v)    {//        if(u==0)//            break;        e[u].push_back(v);        ee[v].push_back(u);//        addedge(u,v);        fk2++;        fk1=max(fk1,u);        fk1=max(fk1,v);    }    fin.close();//    cout<<ecnt1<<" "<<ecnt2<<endl;    n=fk1;    cout<<fk1<<" "<<fk2<<endl;    memset(vis,false,sizeof(vis));    abc=1;    for(int i=1;i<=n;++i)        if(!vis[i])            dfs1(i);    memset(vis,false,sizeof(vis));    for(int i=1;i<=n;++i)    {        g[f[i]]=i;    }    col=0;    for(int i=n;i>=1;--i)        if(!vis[g[i]])        {            ++col;            dfs2(g[i]);        }    cout<<col<<endl;    vc.clear();    mp.clear();    for(i=1;i<=n;++i)    {        mp[l[i]]++;    }    map<int,int>:: iterator it;    int ans[15],ac[15],tmp,tmpp;    for(i=1;i<=min(col,5);++i)    {        tmp=-1;        for(it=mp.begin();it!=mp.end();++it)        {            if(it->second>tmp)            {                tmp=it->second;                tmpp=it->first;            }        }        ans[i]=tmp;        mp[tmpp]=-2;    }    for(;i<=5;++i)    {        ans[i]=0;    }    for(i=1;i<=5;++i)    {        cout<<ans[i]<<" ";    }    cout<<endl;    system("pause");    return 0;}


0 0
原创粉丝点击