题目链接:点击查看

题目大意:给出n个人和m对匹配,现在问有多少组匹配是不必要的,按照升序输出答案

题目分析:因为题目给的N比较小,所以一开始我的想法是先计算出最大匹配,而后枚举每一条边被删除,然后计算最大匹配,如果匹配结果等于最大匹配,则说明这条吧是不必要的,储存答案即可,样例过了但是却WA了,有点自闭,后来只能向网上清一色的看不懂的写法妥协,具体就是每次将枚举的边的两个端点从图中删除,若计算出的最大匹配小于原最大匹配-1,则说明这条边是不必须的,原理不明,可能是我一开始就没看懂题,挂上来主要是看代码,题目不重要

对于这个题有坑,最后的答案可能是0,不判断一下的话会出现RE或PE

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=505;const int M=N*N*2;int n,m,que[M],ql,qr,pre[N],tim=0;struct Edge
{int v,nxt,u;
}e[M],edge[M];int h[N],tot=0;int match[N],f[N],tp[N],tic[N];bool can[N];int find(int x)
{return f[x]==x?f[x]:f[x]=find(f[x]);
}void addedge(int u,int v)
{e[++tot]=(Edge){v,h[u],0};h[u]=tot;
}int lca(int x,int y)
{for (++tim;;swap(x,y)) if(x) {x=find(x);if(tic[x]==tim) return x; else {tic[x]=tim;x=pre[match[x]];}}
}void shrink(int x,int y,int p)
{while(find(x)!=p) {pre[x]=y;y=match[x];if(tp[y]==2) {tp[y]=1;que[++qr]=y;}if(find(x)==x) f[x]=p;if(find(y)==y) f[y]=p;x=pre[y];}
}bool aug(int s)
{for(int i=1;i<=n;++i) f[i]=i;memset(tp,0,sizeof tp);memset(pre,0,sizeof pre);tp[que[ql=qr=1]=s]=1; // 1: type A ; 2: type Bint t=0;while(ql<=qr) {int x=que[ql++];for(int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) {if(find(v)==find(x)||tp[v]==2||can[v]||can[x]) continue; if(!tp[v]) {tp[v]=2;pre[v]=x;if(!match[v]) {for(int now=v,last,tmp;now;now=last) {last=match[tmp=pre[now]];match[now]=tmp,match[tmp]=now;}return true;} tp[match[v]]=1,que[++qr]=match[v];} else if(tp[v]==1) {int l=lca(x,v);shrink(x,v,l);shrink(v,x,l);}}}   return false;
}int solve()
{memset(match,0,sizeof(match));memset(tic,0,sizeof(tic));int ans=0;for(int i=1;i<=n;i++)if(!match[i]&&aug(i))ans++;return ans;
}void init()
{tot=0;memset(h,0,sizeof(h));memset(can,false,sizeof(can));
}int main()
{
//  freopen("input.txt","r",stdin);int m;while(scanf("%d%d",&n,&m)!=EOF){init();for(int i=1;i<=m;i++){scanf("%d%d",&edge[i].u,&edge[i].v);addedge(edge[i].u,edge[i].v);addedge(edge[i].v,edge[i].u);}int cnt=solve();vector<int>ans;for(int i=1;i<=m;i++){can[edge[i].u]=can[edge[i].v]=true;int temp=solve();if(temp<cnt-1)ans.push_back(i);can[edge[i].u]=can[edge[i].v]=false;}printf("%d\n",ans.size());if(ans.size()){printf("%d",ans[0]);for(int i=1;i<ans.size();i++)printf(" %d",ans[i]);}printf("\n");}return 0;
}

HDU - 4687 Boke and Tsukkomi(一般图最大匹配-带花图)相关推荐

  1. HDU 4687 Boke and Tsukkomi【带花树】

    题目链接 题意:一般图最大匹配后会有冗余的小组,求出这些冗余的小组. 明白题意后思路其实非常简单,先求一遍一般图最大匹配,然后枚举每个小组,如果这个小组冗余的话,去掉这个小组之后剩下的小组应该少于原来 ...

  2. HDUOJ 4687 Boke and Tsukkomi

    HDUOJ 4687 Boke and Tsukkomi 题目链接 Problem Description A new season of Touhou M-1 Grand Prix is appro ...

  3. 【学习小记】一般图最大匹配——带花树算法

    Text 一般图的最大匹配仍然是基于寻找增广路的 增广路的定义是这样的一条路径,它不经过重复的点,并且路径两端均没有匹配,且整条路径是非匹配边-匹配边-非匹配边这样交错的. 类比二分图最大匹配的增广路 ...

  4. URAL - 1099 Work Scheduling(一般图最大匹配-带花树模板)

    题目链接:点击查看 题目大意:给出n个警卫,接下来给出数个关系,表示两个警卫可以互相配合,现在规定只有可以互相配合的警卫才能留下来继续工作,问最多能有多少个警卫留下来工作,输出匹配方案 题目分析:一般 ...

  5. 一般图最大匹配——带花树

    所谓花,就是如下图所示的一个奇环: 本文中粗边代表现在的匹配边,细边代表该点的前驱(后文会讲解前驱是什么,现在只需要知道每个点和它的前驱在原图中一定是有边的). 如图所示,一朵包含\(2k+1\)个点 ...

  6. 2020牛客多校第1场I-1 or 2一般图最大匹配带花树

    链接:https://ac.nowcoder.com/acm/contest/5666/I Bobo has a graph with n vertices and m edges where the ...

  7. uoj79 一般图最大匹配 带花树学习(被虐

    辣鸡蒟蒻原来的blog: http://www.elijahqi.win/2018/01/28/uoj79/ 学习资料其一:http://www.csie.ntnu.edu.tw/~u91029/Ma ...

  8. 图解:什么是图?(以“图”话图)

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨景禹 来源丨景禹(LifeAtaraxia) ...

  9. Java数据结构与算法:无向图,有向图,带权图,图的遍历,最小生成树

    文章目录 无向图 有向图 带权图 图的遍历 广度优先遍历 深度优先遍历 最小生成树 无向图 前面了解到树是有单一根结点的非线性结构,图(graph)也是一种非线性结构,其中的结点可以与许多其他的结点相 ...

最新文章

  1. 数据导出Excel表格
  2. EmEditor学习
  3. Complete Tripartite CodeForces - 1228D(三分图染色)
  4. ABB 机器人 DRVIO_1通信报警
  5. 视图中::text_新CalendarFX视图:MonthGridView!
  6. C/C++中near和far的区别
  7. 小汤学编程之JAVA基础day07——面向对象(二):封装、继承与多态
  8. Madagascar中的宏定义函数--绝对值函数和符号函数
  9. Django的应用部署
  10. WTK6900B02语音识别模块,声控模块,语音交互模块,语音识别模块方案-深圳唯创知音电子有限公司...
  11. 结合源码探讨Android距离传感器亮灭屏机制
  12. 隐式反馈的去噪,模型取得巨大提升!
  13. 如何使用SQL Server游标
  14. linux下sybase创建数据库,sybase数据库环境搭建教程(多图教程)
  15. vs2013下载地址以及安装方法
  16. DH密钥交换协议c语言,DH秘钥交换协议
  17. 高性能计算机英语,“超级计算机”英语怎么说
  18. python程序下载腾讯企业邮箱附件_获取腾讯企业邮箱通讯录python脚本(带登录功能)...
  19. android 录像限制时间,视频拍摄能不能限制拍摄时间和微信小视频一样
  20. win7 精简板 安装ardunio uno r3驱动

热门文章

  1. 使用Docker-容器命令案例1
  2. 生产者消费者的实际使用
  3. MyBatis 实际使用案例-一级标签
  4. Stream流中的常用方法_map
  5. Spring Boot整合Spring Data Redis-整合步骤
  6. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象
  7. 希沃展台如何使用_【海安幼教微家园】玩转希沃白板 点亮精彩课堂 —长江路幼儿园开展希沃一体机操作技能培训...
  8. WebSocket 的通信机制
  9. 以下结点node定义了一个学生的信息。函数find查找并返回学号小于num,且下一节点学号不小于num的结点指针
  10. 阿里:马云从未转让和退出淘宝股份 也没有这个打算