首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

poj1904 - King's Quest

  • 24-03-05 07:01
  • 3109
  • 8239
blog.csdn.net

                                  想看更多的解题报告: http://iyenn.com/rec/1824570.html
                                  转载请注明出处:http://blog.csdn.net/wangjian8006

题目大意:国王有n个儿子,现在这n个儿子要在n个女孩里选择自己喜欢的,有的儿子可能喜欢多个,最后国王的向导给出他一个匹配
匹配有n个数,代表某个儿子和哪个女孩可以结婚
已知这些条件,要你找出每个儿子可以和哪些女孩结婚

解题思路:因为给出是一个二分图,很容易会往二分匹配那方面去想,我第一个想法是对于每个儿子,去进行匈牙利匹配。匹配到一个人就删除这
条边,接着匹配,直到不能匹配再恢复到原图,对下一个儿子进行这样的操作。
直到n个儿子都匹配完了,就可以得出一个顺序

看了讨论版,居然用强联通分量去建图,
建图:首先哪个儿子喜欢哪个女的,就用那个儿子的编号指向那个女的的编号
完备匹配就用建相应的反向边
这样分析,如果某个男的可以和女的结婚,那么他们肯定是在一个连通分量里面的,当然,如果他们想结婚的前提是男的必须喜欢女的

  1. /*
  2. 内存太大,建议用邻接表写,这题调的太久,懒得写了
  3. 听说用putchar和getchar+G++提交可以进入几百秒内
  4. Memory 63412K
  5. Time 4641MS
  6. */
  7. #include
  8. #include
  9. #include
  10. using namespace std;
  11. #define MAXV 4020
  12. #define min(a,b) (a>b?b:a)
  13. vector <int>ans;
  14. stack <int>stap;
  15. int map[MAXV][MAXV];
  16. int dfn[MAXV],low[MAXV],belong[MAXV];
  17. int count,n,cnt;
  18. bool instack[MAXV];
  19. void init(){
  20. count=cnt=0;
  21. memset(dfn,0,sizeof(dfn));
  22. memset(low,0,sizeof(low));
  23. memset(instack,0,sizeof(instack));
  24. }
  25. void tarjan(int x){
  26. int i;
  27. dfn[x]=low[x]=++cnt;
  28. stap.push(x);
  29. instack[x]=true;
  30. for(i=1;i<=n<<1;i++){
  31. if(!map[x][i]) continue;
  32. if(!dfn[i]){
  33. tarjan(i);
  34. low[x]=min(low[i],low[x]);
  35. }else if(instack[i])
  36. low[x]=min(dfn[i],low[x]);
  37. }
  38. if(low[x]==dfn[x]){
  39. count++;
  40. while(1){
  41. int tmp=stap.top();
  42. stap.pop();
  43. belong[tmp]=count;
  44. instack[tmp]=false;
  45. if(tmp==x) break;
  46. }
  47. }
  48. }
  49. void work(){
  50. init();
  51. for(int i=1;i<=2*n;i++)
  52. if(!dfn[i]) tarjan(i);
  53. }
  54. int main(){
  55. int i,j,num;
  56. scanf("%d",&n);
  57. for(i=1;i<=n;i++){
  58. scanf("%d",&num);
  59. while(num--){
  60. scanf("%d",&j);
  61. map[i][j+n]=1;
  62. }
  63. }
  64. for(i=1;i<=n;i++){
  65. scanf("%d",&j);
  66. map[j+n][i]=1;
  67. }
  68. work();
  69. for(i=1;i<=n;i++){
  70. ans.clear();
  71. for(j=n+1;j<=n<<1;j++){
  72. if(map[i][j] && belong[i]==belong[j]){
  73. ans.push_back(j-n);
  74. }
  75. }
  76. printf("%d",ans.size());
  77. for(j=0;jsize();j++) printf(" %d",ans[j]);
  78. printf("\n");
  79. }
  80. return 0;
  81. }


 

 

====================================================================

 

纪念下超时的代码....

  1. /*
  2. Time Limit Exceeded
  3. */
  4. #include
  5. using namespace std;
  6. #define MAXV 2001
  7. int n;
  8. bool map[MAXV][MAXV],use[MAXV];
  9. int ans[MAXV][MAXV];
  10. int record[MAXV];
  11. int link[MAXV];
  12. int dfs(int x){
  13. int i,j;
  14. for(i=1;i<=n;i++){
  15. if(!use[i] && map[x][i]){
  16. use[i]=1;
  17. j=link[i];
  18. link[i]=x;
  19. if(j==-1 || dfs(j)) return true;
  20. link[i]=j;
  21. }
  22. }
  23. return false;
  24. }
  25. bool hungary(){
  26. int i;
  27. memset(link,-1,sizeof(link));
  28. for(i=1;i<=n;i++){
  29. memset(use,0,sizeof(use));
  30. if(!dfs(i)) return false;
  31. }
  32. return true;
  33. }
  34. int cmp(const void *a,const void *b){
  35. return *(int *)a-*(int *)b;
  36. }
  37. int main(){
  38. int i,j,num;
  39. while(~scanf("%d",&n)){
  40. memset(map,0,sizeof(map));
  41. for(i=1;i<=n;i++){
  42. scanf("%d",&num);
  43. while(num--){
  44. scanf("%d",&j);
  45. map[i][j]=1;
  46. }
  47. }
  48. memset(ans,0,sizeof(ans));
  49. for(i=1;i<=n;i++){
  50. scanf("%d",&j);
  51. num=0;
  52. map[i][j]=0;
  53. ans[i][++ans[i][0]]=j;
  54. record[num++]=j;
  55. while(hungary()){
  56. ans[i][++ans[i][0]]=link[i];
  57. record[num++]=link[i];
  58. map[i][link[i]]=0;
  59. }
  60. for(j=0;j1; //恢复
  61. }
  62. for(i=1;i<=n;i++){
  63. printf("%d",ans[i][0]);
  64. qsort(ans[i]+1,ans[i][0],sizeof(ans[0][0]),cmp);
  65. for(j=1;j<=ans[i][0];j++) printf(" %d",ans[i][j]);
  66. printf("\n");
  67. }
  68. }
  69. return 0;
  70. }


 

注:本文转载自blog.csdn.net的wangjian8006的文章"http://blog.csdn.net/wangjian8006/article/details/7982518"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top