poj/pku 1904(强连通分量解决匹配问题)
2011-09-27 16:49
281 查看
题目链接:http://poj.org/problem?id=1904
题意描述:有n个王子和n个美女,每个王子有自己喜欢的美女,保证每个王子都能娶到一个自己喜欢的美女,现在巫师给出了一个王子和美女匹配的方案,但是国王想知道每个王子能够娶到的美女的名单(保证每个王子都能娶到美女)
分析:匹配就是找增广路,假设一个王子i和美女j开始匹配,那么假设王子i要和其他美女匹配,那么美女j必定和其它王子匹配,这里我们连接美女到初始的王子,那么形成的强连通分量里的王子和他喜欢的美女都是可以匹配的
代码:
题意描述:有n个王子和n个美女,每个王子有自己喜欢的美女,保证每个王子都能娶到一个自己喜欢的美女,现在巫师给出了一个王子和美女匹配的方案,但是国王想知道每个王子能够娶到的美女的名单(保证每个王子都能娶到美女)
分析:匹配就是找增广路,假设一个王子i和美女j开始匹配,那么假设王子i要和其他美女匹配,那么美女j必定和其它王子匹配,这里我们连接美女到初始的王子,那么形成的强连通分量里的王子和他喜欢的美女都是可以匹配的
代码:
//注意在同一个强连通分量中的美女并不是都能和在该连通分量王子匹配 //因为有的美女不是王子所喜欢的,所以在同一个强连通分量中找和王子 //匹配的美女时只能找王子所喜欢的 #include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cstring> using namespace std; const int N=4010; //表示点的个数 vector<int>g ; int a[N/2]; int low ,dfn ,st ,blg ,index,top,cnt;bool vis ; void tarjan(int u) { int v; low[u]=dfn[u]=index++; st[++top]=u; vis[u]=true; for(int i=0;i<g[u].size();i++) { v=g[u][i]; if(dfn[v]==-1) { tarjan(v); if(low[u]>low[v]) low[u]=low[v]; } else if(low[u]>dfn[v]&&vis[v])low[u]=dfn[v]; } if(low[u]==dfn[u]) { cnt++; int v1; do { v1=st[top]; vis[v1]=false; blg[v1]=cnt; top--; }while(u!=v1); } } int main () { int n,i,j,x,num; while(scanf("%d",&n)!=EOF) { for(i=1;i<=2*n;i++)//清空向量 g[i].clear(); for(i=1;i<=n;i++) { scanf("%d",&num); for(j=0;j<num;j++) { scanf("%d",&x); g[i].push_back(x+n); } } for(i=1;i<=n;i++) { scanf("%d",&x); g[x+n].push_back(i); } memset(low,0,sizeof(low)); memset(dfn,-1,sizeof(dfn)); memset(blg,0,sizeof(blg)); memset(vis,0,sizeof(vis)); index=1;top=0;cnt=0; for(i=1;i<=n;i++) if(dfn[i]==-1) tarjan(i); for(i=1;i<=n;i++) { int t=0; for(j=0;j<g[i].size();j++) if(blg[i]==blg[g[i][j]]) a[t++]=g[i][j]-n; sort(a,a+t); printf("%d",t); for(j=0;j<t;j++) printf(" %d",a[j]); printf("\n"); } } return 0; }
相关文章推荐
- POJ 1904 King's Quest && HDU 4685 Prince and Princess (强联通解决二分图可行匹配问题)
- poj1904 - King's Quest 强连通解决二分匹配问题
- POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
- POJ-3041 Asteroids,二分匹配解决棋盘问题。
- POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
- poj 3692(浅谈二分图最大匹配求最大独立集在解决最大团问题中的应用)
- POJ 1904 King's Quest(强连通分量+匹配)
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES
- poj 3281 Dining (最大流解决匹配问题)
- 【连通图|二分匹配+强连通分量】POJ-1904 King's Quest
- 【面试题】用栈解决括号匹配问题
- poj_3176Cow Bowling问题(已解决)
- 关于使用栈解决括号匹配的问题
- 搜狗输入法输入拼音匹配不对的问题解决
- [C++]连续最长括号匹配问题解决策略二(学习)
- 匈牙利算法—解决二分图最大匹配问题
- win10解决SQL 2008安装出现属性不匹配问题
- pku2195二分图的最佳匹配问题mub
- A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
- 解决高德地图key错误与sha1不匹配或MD5安全码未通过问题