POJ1904(King's Quest)
2012-04-04 22:12
302 查看
题目链接
此题初看起来是一个二分匹配的问题,一个国王有n个儿子,将要与n个女孩结婚,已知每个儿子喜欢某几个女孩,并给出了一个初始匹配,问题是求每个儿子可能与哪些他喜欢的女孩结婚,一旦他选一个结婚后,其他的儿子仍能选到自己喜欢的人结婚。若直接枚举个中可能,然后用匈牙利算法求完美匹配判断,这样的话时间复杂度是O(n5),毫无疑问会超时。在这里,题目给出里一个初始完美匹配,必须加以利用。我们可以把初始完美匹配中的每一对看成结点进行构图,因此每个结点包含一个男孩和一个女孩,若结点i中的男孩喜欢结点j中的女孩,就在结点i与结点j之间连一条有向边,这样问题就转化为求强分图,每个男孩可以与他喜欢的并且与他在同一个强分图中的一个女孩结婚且不影响到其他人。求强分图,我用的是两次dfs的算法。
View Code
此题初看起来是一个二分匹配的问题,一个国王有n个儿子,将要与n个女孩结婚,已知每个儿子喜欢某几个女孩,并给出了一个初始匹配,问题是求每个儿子可能与哪些他喜欢的女孩结婚,一旦他选一个结婚后,其他的儿子仍能选到自己喜欢的人结婚。若直接枚举个中可能,然后用匈牙利算法求完美匹配判断,这样的话时间复杂度是O(n5),毫无疑问会超时。在这里,题目给出里一个初始完美匹配,必须加以利用。我们可以把初始完美匹配中的每一对看成结点进行构图,因此每个结点包含一个男孩和一个女孩,若结点i中的男孩喜欢结点j中的女孩,就在结点i与结点j之间连一条有向边,这样问题就转化为求强分图,每个男孩可以与他喜欢的并且与他在同一个强分图中的一个女孩结婚且不影响到其他人。求强分图,我用的是两次dfs的算法。
View Code
#include <stdio.h> #include <string.h> #define CLR(a) (memset(a,0,sizeof(a))) #define N 2005 char vis ,g ; int boy ,girl ,n; int ord ,id ,cnt; void dfs(int u) { int i,v; vis[u]=1; for(i=0;i<n;i++) { if(g[u][i]) { v=boy[i]; if(!vis[v]) dfs(v); } } ord[cnt++]=u; } void rdfs(int u) { int i=girl[u],v; vis[u]=1,id[u]=cnt; for(v=0;v<n;v++) { if(g[v][i]&&!vis[v]) rdfs(v); } } void kosaraju() { int i,j,v,t,ans ,num; CLR(vis); for(i=0,cnt=0;i<n;i++) { if(!vis[i]) dfs(i); } CLR(vis); for(t=n-1,cnt=0;t>=0;t--) { i=ord[t]; if(!vis[i]) { rdfs(i); cnt++; } } for(i=0;i<n;i++) { for(v=0,num=0;v<n;v++) { if(!g[i][v]) continue; j=boy[v]; if(id[i]==id[j]) ans[num++]=v+1; } printf("%d",num); for(j=0;j<num;j++) printf(" %d",ans[j]); printf("\n"); } } int main() { int i,j,k; while(scanf("%d",&n)!=EOF) { CLR(g); for(i=0;i<n;i++) { scanf("%d",&k); while(k--) { scanf("%d",&j); g[i][j-1]=1; } } for(i=0;i<n;i++) { scanf("%d",&j); girl[i]=j-1; boy[girl[i]]=i; } kosaraju(); } return 0; }
相关文章推荐
- [poj 1904]King's Quest[Tarjan强连通分量]
- POJ 1904 King's Quest 强连通分量+二分图增广判定
- King's Quest - poj 1904(强连通分量+外挂输入输出)
- King's Quest —— POJ1904(ZOJ2470)Tarjan缩点
- POJ 1904:King's Quest【tarjan】
- POJ 1904 King's Quest - from lanshui_Yang
- 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 ★(强连通分量:可行完美匹配边)
- 【连通图|二分匹配+强连通分量】POJ-1904 King's Quest
- POJ 1904 King's Quest(强连通)
- poj 1904 King's Quest 【建模 求解SCC】
- 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 (强连通分量)
- poj 1904 King's Quest 【图论-强连通分量-二分图匹配】