POJ 1904 Kings Quest (强连通分量)

题目地址:POJ 1904 很神奇的一道题啊。至于详解看这篇博客吧,传送门写的非常详细。 代码如下:

;mod=1e9+7;const int INF=0x3f3f3f3f;const double eqs=1e-9;const int MAXN=4000+10;int head[MAXN], cnt, top, scc, indx;int low[MAXN], dfn[MAXN], belong[MAXN], stk[MAXN], instack[MAXN];bool mp[MAXN][MAXN];vector<int>vec[MAXN];struct node{int u, v, next;}edge[1000000];void add(int u, int v){edge[cnt].v=v;edge[cnt].next=head[u];head[u]=cnt++;}void init(){memset(head,-1,sizeof(head));memset(dfn,0,sizeof(dfn));memset(instack,0,sizeof(instack));cnt=top=scc=indx=0;memset(mp,false,sizeof(mp));}void tarjan(int u){low[u]=dfn[u]=++indx;instack[u]=1;stk[++top]=u;for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].v;if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(instack[v]){low[u]=min(low[u],dfn[v]);}}if(low[u]==dfn[u]){scc++;while(1){int v=stk[top–];belong[v]=scc;instack[v]=0;if(u==v) break;}}}int main(){int n, i, j, k, u;while(scanf(“%d”,&n)!=EOF){for(i=0;i<n;i++){vec[i].clear();}init();for(i=0;i<n;i++){scanf(“%d”,&k);while(k–){scanf(“%d”,&u);add(i,u+n-1);mp[i][u-1]=true;}}for(i=0;i<n;i++){scanf(“%d”,&u);add(u+n-1,i);}for(i=0;i<2*n;i++){if(!dfn[i]) tarjan(i);}for(i=0;i<n;i++){for(j=n;j<2*n;j++){if(belong[i]==belong[j]&&mp[i][j-n]){vec[i].push_back(j-n+1);}}printf(“%d”,vec[i].size());for(j=0;j<vec[i].size();j++){printf(” %d”,vec[i][j]);}puts(“”);}}return 0;}

,而更像是听见了天地间冥冥中的呼唤,

POJ 1904 Kings Quest (强连通分量)

相关文章:

你感兴趣的文章:

标签云: