POJ 1904 King's Quest【强连通分量】
2012-08-16 10:02
417 查看
题意: 国王有 N 个王子,一共有 N个女子,知道了每个王子喜欢的女子,和一组互不冲突的男女匹配,问每个王子可以娶那些女子且不影响其他所有的王子都可以娶到
自己喜欢的女子。
分析: 如果某个王子喜欢某个女子,就连一条从该王子到该女子的边,
如果某个女子某个王子可以匹配,就连一条从该女子到该王子的边。
如果一些王子和一些女子的同一个强连通分量里,则这些王子可以娶该强连通分量里的任意的女子。
自己喜欢的女子。
分析: 如果某个王子喜欢某个女子,就连一条从该王子到该女子的边,
如果某个女子某个王子可以匹配,就连一条从该女子到该王子的边。
如果一些王子和一些女子的同一个强连通分量里,则这些王子可以娶该强连通分量里的任意的女子。
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; #define maxn 40005 #define clr(x)memset(x,0,sizeof(x)) struct node { int to,next; }e[300000]; int tot; int head[maxn]; void add(int s,int u) { e[tot].to=u; e[tot].next=head[s]; head[s]=tot++; } int ti,sn,top; int dfn[maxn]; int low[maxn]; int stack[maxn]; bool ins[maxn]; int col[maxn]; int tmp[2002]; int n; void tarjan(int u) { low[u]=dfn[u]=++ti; stack[++top]=u; ins[u]=true; int i,j,k; for(i=head[u];i;i=e[i].next) { k=e[i].to; if(dfn[k]==0) { tarjan(k); if(low[k]<low[u]) low[u]=low[k]; } else if(ins[k]&&dfn[k]<low[u]) low[u]=dfn[k]; } if(dfn[u]==low[u]) { sn++; do { k=stack[top--]; col[k]=sn; ins[k]=false; }while(k!=u); } } int main() { int i,j,k,p,m,t; while(scanf("%d",&n)!=EOF) { tot=1; top=ti=sn=0; clr(head); clr(low); clr(dfn); clr(ins); clr(col); for(i=1;i<=n;i++) { scanf("%d",&m); while(m--) { scanf("%d",&p); add(i,p+n); } } for(i=1;i<=n;i++) { scanf("%d",&p); add(p+n,i); } for(i=1;i<=n;i++) if(dfn[i]==0) tarjan(i); for(i=1;i<=n;i++) { t=0; for(j=head[i];j;j=e[j].next) { k=e[j].to; if(col[i]==col[k]) tmp[t++]=k-n; } sort(tmp,tmp+t); printf("%d",t); for(k=0;k<t;k++) printf(" %d",tmp[k]); printf("\n"); } } return 0; }
相关文章推荐
- Poj 1904 King's Quest 强连通分量
- POJ 1904 King's Quest(强连通分量+匹配)
- POJ-1904-King's Quest(强连通图)
- poj 1904 King's Quest tarjan求二分图的所有可选最大匹配边
- poj 1904 King's Quest 强连通分量
- poj 1904 King's Quest 强连通
- King's Quest - poj 1904(强连通分量+外挂输入输出)
- pku 1904 King's Quest tarjan求强连通分量
- poj 1904 King's Quest
- POJ-1904-King's Quest(强连通分量)
- POJ 1904 King's Quest 强连通分量 +缩点+ 输入输出外挂 (非递归版trajan模板)
- POJ 1904 King's Quest 强连通分量 好题
- poj--1904--King's Quest(scc建图)
- poj 1904 King's Quest(强连通分量)
- POJ 1904 King's Quest
- King's Quest —— POJ1904(ZOJ2470)Tarjan缩点
- POJ 1904 King's Quest(强连通)
- poj 1904 强连通分量
- 【连通图|二分匹配+强连通分量】POJ-1904 King's Quest
- poj 1904 强连通分量 tarjan