| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
用不了c++11 iota()与lambda语句第一次korasaju纪念一下/*Korasaju算法求有向图强连通分支
procedure Strongly_Connected_Components(G);
begin
1.深度优先遍历G,算出每个结点u的结束时间f[u],起
点如何选择无所谓。
2.深度优先遍历G的转置图G T ,选择遍历的起点时,
按照结点的结束时间从大到小进行。遍历的过程中,
一边遍历,一边给结点做分类标记,每找到一个新的
起点,分类标记值就加1。
3. 第2步中产生的标记值相同的结点构成深度优先森
林中的一棵树,也即一个强连通分量
end*/
#include<iostream>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int,int> cline;
vector<cline> myline;
const int maxn=10010;
vector<vector<int>> G(maxn);
vector<vector<int>> GT(maxn);
int dfn[maxn]={},becolor[maxn]={},colorout[maxn]={},p[maxn]={};
int index=1,color=1,n,m;
bool cmp(int x,int y)
{
return dfn[x]>dfn[y];
}
void dfs(int u,bool x);
void Korasaju()
{
for(int i=1;i<=n;i++)
{
if(!dfn[i])dfs(i,false);
}
for(int i=0;i<=n;i++)p[i]=i;
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(!becolor[p[i]])
{
dfs(p[i],true);
color++;
}
}
}
void dfs(int u,bool isT)
{
if(isT)
{
becolor[u]=color;
for(int i=0;i<GT[u].size();i++)
{
int v=GT[u][i];
if(!becolor[v])dfs(v,true);
}
}
else
{
dfn[u]=index;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(!dfn[v])dfs(v,false);
}
dfn[u]=++index;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
GT[v].push_back(u);
myline.push_back(cline(u,v));
}
Korasaju();
for(int i=0;i<myline.size();i++)
{
int u=myline[i].first,v=myline[i].second;
if(becolor[u]!=becolor[v])colorout[becolor[u]]++;
}
int colorsign=0;
int colorc=0;
for(int i=1;i<color;i++)
{
if(!colorout[i])
{
colorsign=i;
colorc++;
}
}
int result=0;
for(int i=1;i<=n;i++)if(becolor[i]==colorsign)result++;
if(colorc==1)printf("%d",result);
else printf("0");
}
/*
input
3 3
1 2
2 3
3 1
3 3
1 2
2 1
2 3
5 4
1 4
2 4
3 4
5 4
5 5
1 2
2 3
3 1
1 4
4 5
5 6
1 2
2 3
3 1
1 4
4 5
5 3
2 2
1 2
2 1
3 2
1 2
2 1
6 6
1 2
2 3
3 1
1 4
4 5
5 3
5 6
1 2
2 3
3 1
1 4
4 5
5 4
5 7
4 1
1 2
2 3
3 1
1 4
4 5
5 4
5 6
1 2
2 3
3 1
1 4
4 5
5 1
7 9
1 2
2 3
3 1
4 5
5 6
6 4
4 7
7 1
1 7
6 6
1 2
2 3
3 1
4 5
5 6
6 4
4 4
1 2
2 3
3 1
1 4
4 4
1 2
2 3
3 1
4 1
5 6
1 2
2 3
3 1
5 1
5 4
3 4
7 9
1 2
2 3
3 1
5 1
5 4
3 4
4 7
7 6
6 4
output
3
1
1
1
5
2
0
0
2
5
5
4
0
1
3
1
3*/
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator