博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1191 [HNOI2006]超级英雄Hero 二分图匹配
阅读量:5308 次
发布时间:2019-06-14

本文共 1315 字,大约阅读时间需要 4 分钟。

欢迎访问~原文出处——



题目概括

  有m个题目,有n个解决方案;对于每一个题目,有两种解决方案可用。

  每种解决方案只能用一次,问最多可以通过最前面的几题?


 

题解

  几乎是裸的二分图匹配。

  每个题目两条边,分别连向所对应的两种解决方案。

  然后跑匈牙利算法。具体可以看,往后翻就有匈牙利算法的解说。

  可怕的是,我之前以为是最多可以通过几道。

  白白wa了很久……

  其实是从第一题开始,最多可以连续通过几道。


代码

#include 
#include
#include
#include
#include
using namespace std;const int N=2000+5,M=N;struct Gragh{ int cnt,x[M],y[M],nxt[M],fst[N]; void set(){ cnt=0; memset(fst,0,sizeof fst); } void add(int a,int b){ x[++cnt]=a,y[cnt]=b; nxt[cnt]=fst[a],fst[a]=cnt; }}g;int n,m,cnt,vis[N],match[N];bool dfs(int x){ for (int i=g.fst[x];i;i=g.nxt[i]) if (!vis[g.y[i]]){ vis[g.y[i]]=1; if (match[g.y[i]]==-1||dfs(match[g.y[i]])){ match[g.y[i]]=x; return 1; } } return 0;}int main(){ scanf("%d%d",&n,&m); g.set(); memset(match,-1,sizeof match); cnt=0; for (int i=1,a,b;i<=m;i++){ scanf("%d%d",&a,&b); a++,b++; g.add(i,m+a); g.add(i,m+b); memset(vis,0,sizeof vis); if (dfs(i)) cnt++; else break; } printf("%d",cnt); return 0;}

 

转载于:https://www.cnblogs.com/zhouzhendong/p/BZOJ1191.html

你可能感兴趣的文章
C#使用Xamarin开发可移植移动应用(2.Xamarin.Forms布局,本篇很长,注意)附源码
查看>>
jenkins搭建
查看>>
C#中使用Split分隔字符串的技巧
查看>>
eclipse的调试方法的简单介绍
查看>>
加固linux
查看>>
IPSP问题
查看>>
HNU 10362 A+B for Input-Output Practice (II)
查看>>
10.17动手动脑
查看>>
WPF中Image显示本地图片
查看>>
Windows Phone 7你不知道的8件事
查看>>
脚本删除文件下的文件
查看>>
实用拜占庭容错算法PBFT
查看>>
java的二叉树树一层层输出,Java构造二叉树、树形结构先序遍历、中序遍历、后序遍历...
查看>>
php仿阿里巴巴,php实现的仿阿里巴巴实现同类产品翻页
查看>>
Node 中异常收集与监控
查看>>
七丶Python字典
查看>>
Excel-基本操作
查看>>
面对问题,如何去分析?(分析套路)
查看>>
Excel-逻辑函数
查看>>
面对问题,如何去分析?(日报问题)
查看>>