首页 > 代码库 > poj 1904 King's Quest 强连通分量
poj 1904 King's Quest 强连通分量
讲一下建图过程,题目给出了我们一组匹配match[i] 。对于这一组匹配好的解,我们建边 i->j, 对于能匹配但是不是题目给出的匹配的边,建边j->i; 那么对于一个son和一个gril,如果属于同一个强连通且能过匹配的就一定是满足条件的 。
VIEW CODE
#include<cstdio> #include<algorithm> #include<iostream> #include<cmath> #include<queue> #include<stack> #include<string> #include<cstring> #include<map> #include<vector> #include<set> #include<ctime> #include<stdlib.h> using namespace std; const int mmax= 4010; const int mod=1000000007; typedef long long LL; struct node { int st,en; int next; }E[200010]; int p[mmax],fa[mmax]; int num; void init() { memset(p,-1,sizeof p); num=0; } void add(int st,int en) { E[num].st=st; E[num].en=en; E[num].next=p[st]; p[st]=num++; } int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } int times,pp; int low[mmax],dfn[mmax],Q[mmax]; bool instack[mmax]; void tarjin(int u) { dfn[u]=low[u]=++times; Q[++pp]=u; instack[u]=1; for(int i=p[u];i+1;i=E[i].next) { int v=E[i].en; if(!dfn[v]) { tarjin(v); if(low[u]>low[v]) low[u]=low[v]; } else if(instack[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { while(pp) { int x=Q[pp--]; instack[x]=0; if(x==u) break; int xx=find(x); fa[xx]=u; } } } bool G[2100][2100]; int match[2100]; int main() { int n; while(cin>>n) { init(); for(int i=1;i<=2*n;i++) fa[i]=i; memset(G,0,sizeof G); for(int i=1;i<=n;i++) { int ki,x; scanf("%d",&ki); while(ki--) { scanf("%d",&x); G[i][x]=1; } } for(int i=1;i<=n;i++) { scanf("%d",&match[i]); add(i,match[i]+n); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(G[i][j] && j!=match[i]) add(j+n,i); } memset(dfn,0,sizeof dfn); memset(instack,0,sizeof instack); times=pp=0; for(int i=1;i<=2*n;i++) if(!dfn[i]) tarjin(i); for(int i=1;i<=n;i++) { int cnt=0; for(int j=1;j<=n;j++) { if(j==match[i] || (G[i][j] && find(i)==find( j+n) )) cnt++; } printf("%d",cnt); for(int j=1;j<=n;j++) { if(j==match[i] || (G[i][j] && find(i)==find( j+n) )) printf(" %d",j); } puts(""); } } return 0; }
poj 1904 King's Quest 强连通分量
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。