UESTC 898 方老师和缘分 --二分图匹配+强连通分量
这题原来以为是某种匹配问题,后来好像说是强连通的问题。
做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u->i。这样求出所有的强连通分量,每个强连通分量中方老师和缘分的数目一定是相等的,所以每个方老师一定可以找到与他在同一个强连通分量里的缘分,因为强连通分量中每个点都是可达的,某个方老师找到了其强连通分量中的非原配点,则该原配缘分一定可以在强连通分量中找到"新欢"。可以画个图看看。
由于要构造非二分图,缘分的编号从n+1开始,到2n。
代码:
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <stack>
- #define Mod 1000000007
- using namespace std;
- #define N 200007
- std::vector<int> G[];
- int low[],dfn[];
- int instk[],bel[];
- int n,Time,cnt,res;
- stack<int> stk;
- int ans[];
- void Tarjan(int u)
- {
- low[u] = dfn[u] = ++Time;
- stk.push(u);
- instk[u] = ;
- for(int i=;i<G[u].size();i++)
- {
- int v = G[u][i];
- if(!dfn[v])
- {
- Tarjan(v);
- low[u] = min(low[u],low[v]);
- }
- else if(instk[v])
- low[u] = min(low[u],dfn[v]);
- }
- if(low[u] == dfn[u])
- {
- cnt++;
- int v;
- do
- {
- v = stk.top();
- stk.pop();
- instk[v] = ;
- bel[v] = cnt;
- }while(u != v);
- }
- }
- void init()
- {
- memset(G,,sizeof(G));
- memset(instk,,sizeof(instk));
- memset(bel,-,sizeof(bel));
- memset(low,,sizeof(low));
- memset(dfn,,sizeof(dfn));
- Time = cnt = ;
- while(!stk.empty())
- stk.pop();
- }
- int main()
- {
- int i,j,u,v,k;
- while(scanf("%d",&n)!=EOF)
- {
- init();
- for(i=;i<=n;i++)
- {
- scanf("%d",&k);
- while(k--)
- {
- scanf("%d",&v);
- G[i].push_back(v+n);
- }
- }
- for(i=;i<=n;i++)
- {
- scanf("%d",&v);
- G[v+n].push_back(i);
- }
- for(i=;i<=n;i++)
- {
- if(!dfn[i])
- Tarjan(i);
- }
- for(u=;u<=n;u++)
- {
- k = ;
- for(i=;i<G[u].size();i++)
- {
- v = G[u][i];
- if(bel[u] == bel[v])
- ans[k++] = v-n;
- }
- sort(ans,ans+k);
- printf("%d",k);
- for(i=;i<k;i++)
- printf(" %d",ans[i]);
- printf("\n");
- }
- }
- return ;
- }
UESTC 898 方老师和缘分 --二分图匹配+强连通分量的更多相关文章
- UESTC 901 方老师抢银行 --Tarjan求强连通分量
思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...
- poj1904 二分图匹配+强连通分量
http://poj.org/problem?id=1904 Description Once upon a time there lived a king and he had N sons. An ...
- Luogu3731 HAOI2017新型城市化(二分图匹配+强连通分量)
将未建立贸易关系看成连一条边,那么这显然是个二分图.最大城市群即最大独立集,也即n-最大匹配.现在要求的就是删哪些边会使最大匹配减少,也即求哪些边一定在最大匹配中. 首先范围有点大,当然是跑个dini ...
- UESTC - 900 方老师炸弹 —— 割点
题目链接:https://vjudge.net/problem/UESTC-900 方老师炸弹 Time Limit: 4000/2000MS (Java/Others) Memory L ...
- hdu 4685 二分匹配+强连通分量
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4685 题解: 这一题是poj 1904的加强版,poj 1904王子和公主的人数是一样多的,并且给出 ...
- hdu 4685(匹配+强连通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 思路:想了好久,终于想明白了,懒得写了,直接copy大牛的思路了,写的非常好! 做法是先求一次最 ...
- 【题解】新型城市化 HAOI2017 网络流 二分图最大匹配 强连通分量
Prelude 好,HAOI2017终于会做一道题了! 传送到洛谷:→_→ 传送到LOJ:←_← 本篇博客链接:(●'◡'●) Solution 首先要读懂题. 考场上我是这样想的QAQ. 我们把每个 ...
- UESTC 884 方老师的专题讲座 --数位DP
定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数. 首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数. 然后给定n,计算[1, ...
- UESTC 885 方老师买表 --状压DP
将方格的摆放分成两种: 1.水平摆放:此时所占的两个格子都记为1. 2.竖直摆放:此时底下那个格子记为1,上面那个记为0. 这样的话,每行都会有一个状态表示. 定义:dp[i][s]表示考虑已经填到第 ...
随机推荐
- php中的抛出异常和捕捉特定类型的异常
测试环境:PHP5.5.36 Safari 9.1.2 异常捕获,在现在很多ide工具里都可以用快捷键很方便的添加上,防止用户看到自己看不懂的报错甚至莫名其妙崩溃,导致用户体验不好. 哪怕显示一 ...
- emulator: ERROR: x86 emulation currently requires hardware acceleration!
emulator: ERROR: x86 emulation currently requires hardware acceleration!Please ensure Intel is prop ...
- andriod 图片选择器
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="ht ...
- 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 ...
- 转:NLog 自定义日志内容,写日志到数据库;修改Nlog.config不起作用的原因
转:http://www.cnblogs.com/tider1999/p/4308440.html NLog的安装请百度,我安装的是3.2.NLog可以向文件,数据库,邮件等写日志,想了解请百度,这里 ...
- 我在用的mac软件(2)-终端环境之zsh和z(*nix都适用)
继续上篇介绍我的终端环境.这篇介绍zsh和z,其实这不局限于os x,在所有的*nix系统中都是可用的. zsh zsh作为bash的替代品,自然很多人要问:why zsh? 在Zsh Worksho ...
- Android APK 文件自动安装
1.权限 <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> 2.方法 Uri ...
- C语言常量与指针
C语言功能强大而丰富,还表现在const与指针的结合使用上,对不同的问题,它提供不同的保护,特别有用的是指向常量的指针 本文地址:http://www.cnblogs.com/archimedes/p ...
- 关于android初学者必须掌握的Activity的四大知识点
这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在Android学习中很重要的一个组件Activity,那就开始吧! ...
- Matlab2014下载和破解方法,以及Matlab很好的学习网站
ISO镜像下载地址链接: http://pan.baidu.com/s/1i31bu5J 密码: obo1 单独破解文件下载链接: http://pan.baidu.com/s/1c0CGQsw 密 ...