欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1191


题目概括

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

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


题解

  几乎是裸的二分图匹配。

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

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

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

  白白wa了很久……

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


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+,M=N;
struct Gragh{
int cnt,x[M],y[M],nxt[M],fst[N];
void set(){
cnt=;
memset(fst,,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]]=;
if (match[g.y[i]]==-||dfs(match[g.y[i]])){
match[g.y[i]]=x;
return ;
}
}
return ;
}
int main(){
scanf("%d%d",&n,&m);
g.set();
memset(match,-,sizeof match);
cnt=;
for (int i=,a,b;i<=m;i++){
scanf("%d%d",&a,&b);
a++,b++;
g.add(i,m+a);
g.add(i,m+b);
memset(vis,,sizeof vis);
if (dfs(i))
cnt++;
else
break;
}
printf("%d",cnt);
return ;
}

最新文章

  1. sas编程-日期相差计算函数 intnx
  2. python 实现树结构的打印
  3. xpath爬取网页评论,网址的的调用方法,数据库特殊字符的替换
  4. Atititi tesseract使用总结
  5. Java并发编程知识总结
  6. WCF之绑定
  7. Tcl语言笔记之二
  8. Python笔记之基本的语法
  9. SQL Server定时自动抓取耗时SQL并归档数据脚本分享
  10. HDU4876ZCC loves cards(多校题)
  11. id,is的用法,小数据池的概念及编码知识进阶
  12. OpenCV实现图像上添加汉字 转
  13. hadoop入门级总结二:Map/Reduce
  14. css:id选择器的权重&gt;class选择器的权重=属性选择器的权重&gt;元素选择器
  15. Grovvy带参数的闭包
  16. redis maxheap 51200000
  17. 软件工程M1/M2总结及阅读作业总结
  18. swift语言版本选择 - 解决XCode报错:The “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported valu
  19. Linux使用一个定时器实现设置任意数量定时器功能【转】
  20. [BZOJ4027][HEOI2015]兔子与樱花 树形dp

热门文章

  1. 【转】Robot Framework作者建议如何选择自动化测试框架
  2. PMM安装-第一篇
  3. 移动前端框架,require.js压缩
  4. 一:对程序员来说CPU是什么?
  5. python 设计及调试的一些小技巧
  6. 【转】mysql8.0 在window环境下的部署与配置
  7. 一文看懂汽车电子ECU bootloader工作原理及开发要点
  8. unicode-range特定字符使用font-face自定义字体
  9. 目标检测--Spatial pyramid pooling in deep convolutional networks for visual recognition(PAMI, 2015)
  10. vue构建项目全过程