这题原来以为是某种匹配问题,后来好像说是强连通的问题。

做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u->i。这样求出所有的强连通分量,每个强连通分量中方老师和缘分的数目一定是相等的,所以每个方老师一定可以找到与他在同一个强连通分量里的缘分,因为强连通分量中每个点都是可达的,某个方老师找到了其强连通分量中的非原配点,则该原配缘分一定可以在强连通分量中找到"新欢"。可以画个图看看。

由于要构造非二分图,缘分的编号从n+1开始,到2n。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <queue>
  8. #include <stack>
  9. #define Mod 1000000007
  10. using namespace std;
  11. #define N 200007
  12.  
  13. std::vector<int> G[];
  14. int low[],dfn[];
  15. int instk[],bel[];
  16. int n,Time,cnt,res;
  17. stack<int> stk;
  18. int ans[];
  19.  
  20. void Tarjan(int u)
  21. {
  22. low[u] = dfn[u] = ++Time;
  23. stk.push(u);
  24. instk[u] = ;
  25. for(int i=;i<G[u].size();i++)
  26. {
  27. int v = G[u][i];
  28. if(!dfn[v])
  29. {
  30. Tarjan(v);
  31. low[u] = min(low[u],low[v]);
  32. }
  33. else if(instk[v])
  34. low[u] = min(low[u],dfn[v]);
  35. }
  36. if(low[u] == dfn[u])
  37. {
  38. cnt++;
  39. int v;
  40. do
  41. {
  42. v = stk.top();
  43. stk.pop();
  44. instk[v] = ;
  45. bel[v] = cnt;
  46. }while(u != v);
  47. }
  48. }
  49.  
  50. void init()
  51. {
  52. memset(G,,sizeof(G));
  53. memset(instk,,sizeof(instk));
  54. memset(bel,-,sizeof(bel));
  55. memset(low,,sizeof(low));
  56. memset(dfn,,sizeof(dfn));
  57. Time = cnt = ;
  58. while(!stk.empty())
  59. stk.pop();
  60. }
  61.  
  62. int main()
  63. {
  64. int i,j,u,v,k;
  65. while(scanf("%d",&n)!=EOF)
  66. {
  67. init();
  68. for(i=;i<=n;i++)
  69. {
  70. scanf("%d",&k);
  71. while(k--)
  72. {
  73. scanf("%d",&v);
  74. G[i].push_back(v+n);
  75. }
  76. }
  77. for(i=;i<=n;i++)
  78. {
  79. scanf("%d",&v);
  80. G[v+n].push_back(i);
  81. }
  82. for(i=;i<=n;i++)
  83. {
  84. if(!dfn[i])
  85. Tarjan(i);
  86. }
  87. for(u=;u<=n;u++)
  88. {
  89. k = ;
  90. for(i=;i<G[u].size();i++)
  91. {
  92. v = G[u][i];
  93. if(bel[u] == bel[v])
  94. ans[k++] = v-n;
  95. }
  96. sort(ans,ans+k);
  97. printf("%d",k);
  98. for(i=;i<k;i++)
  99. printf(" %d",ans[i]);
  100. printf("\n");
  101. }
  102. }
  103. return ;
  104. }

UESTC 898 方老师和缘分 --二分图匹配+强连通分量的更多相关文章

  1. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

  2. poj1904 二分图匹配+强连通分量

    http://poj.org/problem?id=1904 Description Once upon a time there lived a king and he had N sons. An ...

  3. Luogu3731 HAOI2017新型城市化(二分图匹配+强连通分量)

    将未建立贸易关系看成连一条边,那么这显然是个二分图.最大城市群即最大独立集,也即n-最大匹配.现在要求的就是删哪些边会使最大匹配减少,也即求哪些边一定在最大匹配中. 首先范围有点大,当然是跑个dini ...

  4. UESTC - 900 方老师炸弹 —— 割点

    题目链接:https://vjudge.net/problem/UESTC-900   方老师炸弹 Time Limit: 4000/2000MS (Java/Others)     Memory L ...

  5. hdu 4685 二分匹配+强连通分量

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 这一题是poj 1904的加强版,poj 1904王子和公主的人数是一样多的,并且给出 ...

  6. hdu 4685(匹配+强连通分量)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 思路:想了好久,终于想明白了,懒得写了,直接copy大牛的思路了,写的非常好! 做法是先求一次最 ...

  7. 【题解】新型城市化 HAOI2017 网络流 二分图最大匹配 强连通分量

    Prelude 好,HAOI2017终于会做一道题了! 传送到洛谷:→_→ 传送到LOJ:←_← 本篇博客链接:(●'◡'●) Solution 首先要读懂题. 考场上我是这样想的QAQ. 我们把每个 ...

  8. UESTC 884 方老师的专题讲座 --数位DP

    定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...

  9. UESTC 885 方老师买表 --状压DP

    将方格的摆放分成两种: 1.水平摆放:此时所占的两个格子都记为1. 2.竖直摆放:此时底下那个格子记为1,上面那个记为0. 这样的话,每行都会有一个状态表示. 定义:dp[i][s]表示考虑已经填到第 ...

随机推荐

  1. php中的抛出异常和捕捉特定类型的异常

    测试环境:PHP5.5.36  Safari 9.1.2   异常捕获,在现在很多ide工具里都可以用快捷键很方便的添加上,防止用户看到自己看不懂的报错甚至莫名其妙崩溃,导致用户体验不好. 哪怕显示一 ...

  2. emulator: ERROR: x86 emulation currently requires hardware acceleration!

    emulator: ERROR: x86 emulation currently requires hardware acceleration!Please ensure Intel  is prop ...

  3. andriod 图片选择器

    <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...

  4. SQL SERVER – Attach mdf file without ldf file in Database

    Background Story: One of my friends recently called up and asked me if I had spare time to look at h ...

  5. 转:NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因

    转:http://www.cnblogs.com/tider1999/p/4308440.html NLog的安装请百度,我安装的是3.2.NLog可以向文件,数据库,邮件等写日志,想了解请百度,这里 ...

  6. 我在用的mac软件(2)-终端环境之zsh和z(*nix都适用)

    继续上篇介绍我的终端环境.这篇介绍zsh和z,其实这不局限于os x,在所有的*nix系统中都是可用的. zsh zsh作为bash的替代品,自然很多人要问:why zsh? 在Zsh Worksho ...

  7. Android APK 文件自动安装

    1.权限 <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> 2.方法 Uri ...

  8. C语言常量与指针

    C语言功能强大而丰富,还表现在const与指针的结合使用上,对不同的问题,它提供不同的保护,特别有用的是指向常量的指针 本文地址:http://www.cnblogs.com/archimedes/p ...

  9. 关于android初学者必须掌握的Activity的四大知识点

    这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在Android学习中很重要的一个组件Activity,那就开始吧! ...

  10. Matlab2014下载和破解方法,以及Matlab很好的学习网站

    ISO镜像下载地址链接: http://pan.baidu.com/s/1i31bu5J 密码: obo1  单独破解文件下载链接: http://pan.baidu.com/s/1c0CGQsw 密 ...