Description:

L公司和H公司举办了一次联谊晚会。晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞。在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的,这样的认识关系一共有T对。舞会上,每位员工会尝试选择一名Ta认识的对方公司的员工作为舞   伴,并且每位员工至多跳一支舞。完成的交际舞的数量越多,晚会的气氛就越热烈。顾及到晚会的气氛,员工们希望知道,哪些员工之间如果进行了交际舞,就会使整场晚会能够完成的交际舞的最大数量减小。

Input

第一行三个整数N、M、T。 接下来T行每行两个整数x、y,表示L公司的员工x和H公司的员工y互相认识。

output

第一行一个整数cnt,表示进行了交际舞后会使整场晚会能够完成的交际舞的最大数量减小的员工有多少对。 第二行cnt个整数,升序输出这样的一对员工的认识关系的编号(他们的认识关系是在输入数据中读入的第几条认识关系)。如果cnt=0,输出一个空行。

思路:判断二分图匹配的可行变与不可行边,就是二分图跑完网络流后,将匹配边所对应的两点加入新的图,然后跑一个tarjan

此时必须边的判定条件为:(x,y)流量为1,并且在残量网络上属于不同的强联通分量。可行边的判断条件为(x,y)的流量为1,或者在残量网络上属于同一个前强联通分量

#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
const int N = , M = , INF = 1e9; int head[N], now = ;
struct edges{
int to,next,w;
}edge[M<<];
void add(int u,int v,int w){ edge[++now].to = v, edge[now].next = head[u], edge[now].w = w; head[u] = now; } int n, m, q, s, t, maxflow, dep[N];
struct input{
int x,y;
}inp[M]; bool bfs(){
memset(dep,,sizeof(dep));
queue<int> q;
q.push(s);
dep[s] = ;
while(!q.empty()){
int x = q.front(); q.pop();
for(int i = head[x]; i; i = edge[i].next){
int v = edge[i].to;
if(edge[i].w && !dep[v]){
q.push(v);
dep[v] = dep[x] + ;
if(v == t) return ;
}
}
}
return ;
}
int dinic(int x,int flow){
if(x == t) return flow;
int rest = flow, k;
for(int i = head[x]; i && rest; i = edge[i].next){
int v = edge[i].to;
if(edge[i].w && dep[v] == dep[x] + ){
k = dinic(v, min(rest, edge[i].w));
if(!k) dep[v] = ;
edge[i].w -= k;
edge[i ^ ].w += k;
rest -= k;
}
}
return flow - rest;
} vector<int> vec[N], ans;
void add2(int u,int v) { vec[u].push_back(v);}
int dfn[N], low[N], cnt, tot, dict[N];
bool vis[N];
stack<int> sta;
void tarjan(int x){
dfn[x] = low[x] = ++cnt;
sta.push(x); vis[x] = ;
for(int i = ; i < vec[x].size(); i++){
int v = vec[x][i];
if(!dfn[v]){
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis[v]) low[x] = min(low[x], dfn[v]);
}
if(dfn[x] == low[x]){
tot++;
int temp = -;
do{
temp = sta.top(); sta.pop();
vis[temp] = ;
dict[temp] = tot;
}while(temp != x);
}
return ;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>q;
int x,y;
for(int i = ; i <= q; i++){ //左部节点为1 ~ n,右部节点为 n ~ n + m
cin>>x>>y;
y += n;
inp[i].x = x, inp[i].y = y;
add(x,y,); add(y,x,);
}
s = , t = n+m+;
for(int i = ; i <= n; i++)
add(s,i,), add(i,s,);
for(int i = n+; i <= n+m; i++)
add(i,t,), add(t,i,);
int tmp = ;
while(bfs())
while(tmp = dinic(s,INF)) maxflow += tmp; //最大流解二分图匹配
for(int i = ; i <= now; i++) //将匹配了的边所对应的两点加入新图
if(edge[i].w) add2(edge[i ^ ].to, edge[i].to);
for(int i = s; i <= t; i++) //tarjan找scc
if(!dfn[i]) tarjan(i);
for(int i = ; i <= q; i++) //关于不可行边的判断条件
if(dict[inp[i].x] != dict[inp[i].y] && edge[i * ].w != )
ans.push_back(i);
int tot = ans.size();
cout<<tot<<endl;
for(int i = ; i < ans.size(); i++){
if(i < tot - ) cout<<ans[i]<<" ";
else cout<<ans[i]<<endl;
}
return ;
}

注意最后空格的输出……不然PE

ContestHunter#17-C 舞动的夜晚的更多相关文章

  1. CH Round #17 舞动的夜晚

    舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的 ...

  2. [Contest Hunter#17-C] 舞动的夜晚

    [题目链接] http://contest-hunter.org:83/contest/CH%20Round%20%2317/%E8%88%9E%E5%8A%A8%E7%9A%84%E5%A4%9C% ...

  3. CH#17C 舞动的夜晚

    原题链接 即求二分图的不可行边数量,因为不保证是完备匹配,所以需要通过网络流求出任意一组最大匹配,并建立新图判断. 建新图:对于跑完网络流的图上已经匹配的边,建立反边:对于没有匹配的边,建立正边(图只 ...

  4. AcWing 380. 舞动的夜晚

    大型补档计划 题目链接 这题是求必须边,而不是不可行边,因为不可行边 = 必须边 + 死掉了的边(貌似lyd第三版书上还是说的不可行边)先跑最大流. 在跑完以后的残余网络上,对于一条当前匹配的边 \( ...

  5. Noip模拟58 2021.9.21(中秋祭&&换机房祭)

    第一次在学校过中秋节,给家里人视频电话,感觉快回家了很开心, 然后还吃了汉堡喝饮料非常爽,颓废了一会儿还换了新机房,$Linux2.0$非常dei,少爷机也非常快, 发现好像测评机又成了老爷机,这就是 ...

  6. 总结-一本通提高篇&算竞进阶记录

    当一个人看见星空,就再无法忍受黑暗 为了点亮渐渐沉寂的星空 不想就这样退役 一定不会鸽の坑 . 一本通提高篇 . 算竞进阶 . CDQ & 整体二分 . 平衡树 . LCT . 字符串 . 随 ...

  7. 0x6A 网络流初步

    CH Round #17-C 这个算是一个技能点吧,不点不会,点了就没什么了.懒得写看书吧书上的1应该是0... 我又回来了太懒了不想翻书还是写写吧 必须边的判定条件:该边流量为0且两端的点在残余网络 ...

  8. [考试反思]1019csp-s模拟测试80(a):天遣

    A组题,所以把榜粘全了. 第6名,被卡在刚好正中间. 我最近干什么伤天害理的事了?(例如说没有在skyh去上厕所的时候捶他) 上来看T1,非常贴心出题人直接把递推式子给你了,然后就和斐波数的递推一样了 ...

  9. 二分图&网络流初步

    链接 : 最小割&网络流应用 EK太低级了,不用. 那么请看:#6068. 「2017 山东一轮集训 Day4」棋盘,不用EK你试试? dinic模板及部分变形应用见zzz大佬的博客:网络流学 ...

随机推荐

  1. 码云配置webhooks自动触发拉取代码

    webhooks的使用 码云和github的钩子叫webhooks 每次您 push 代码后,都会给远程 HTTP URL 发送一个 POST 请求 码云项目管理页面的webhooks设置: http ...

  2. Vijos 纸牌

    题目网址 https://vijos.org/d/Randle/p/5a0011e1d3d8a10a532d6d71 题目描述 在桌面上放着n张纸牌,每张纸牌有两面,每面都写着一个非负整数.你的邪王真 ...

  3. python2.7入门---变量类型&案例

      这篇文章呢,主要是用来记录python中的变量类型学习内容的.接下来就来看一下变量类型,那么什么是变量呢.变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解 ...

  4. 公用的cefsharp窗口

    书接上回,.net实现一个nw,一个字,简单. 结构,无废话,上图. 要说这部分上回展示过的,大致结构如此,其实要说清楚结构,还是得从工作流程开始说起 流程 1.通过桌面的快捷方式启动WebOnDes ...

  5. LeetCode:20. Valid Parentheses(Easy)

    1. 原题链接 https://leetcode.com/problems/valid-parentheses/description/ 2. 题目要求 给定一个字符串s,s只包含'(', ')',  ...

  6. c#根据ip获取城市地址

    用的API是百度.新浪.淘宝: 1.首先是一个检测获取的值是不是中文的方法,因为有的ip只能识别出来某省,而城市名称则为空返回的json里会出现null或undefined. public stati ...

  7. 接口测试工具postman(二)创建新项目

    1.此次添加一个request,可以点击左上角的New的下拉选择Request,或者点击New弹出选项框点击Request 2.弹出新增request页面 3.添加请求的参数等 4.也可以直接添加新请 ...

  8. 常用模块(xml)

    XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据.在编程中,对XML的操作也非常常见. 本文根据python库文档中的xml.etree.ElementTree类来进行介绍X ...

  9. jmeter实例,如果有说明错误,请各位大神批评

    首先我们打开jmeter,今天录制的脚本的是获取QQ头像,找了好久才找到可以免费试用的接口,如果有什么错误的地方,欢迎大家提出来,我会及时修改,也给自己一次进步的机会,希望大家不吝赐教!!!如果有什么 ...

  10. [leetcode-636-Exclusive Time of Functions]

    Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...