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;
}