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 |
Re:用不了c++11 iota()与lambda语句第一次korasaju纪念一下In Reply To:用不了c++11 iota()与lambda语句第一次korasaju纪念一下 Posted by:983543692 at 2016-05-27 20:51:18 > /*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*/ 是kosaraju不是korasaju喔! Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator