博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Luogu 1640] SCOI2010 连续攻击游戏
阅读量:5036 次
发布时间:2019-06-12

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

[Luogu 1640] SCOI2010 连续攻击游戏


DP太恶心,回来二分图这边放松一下心智。

这个建图真的是难以想到。

因为要递增啊,属性值放x部,装备放y部,对应连边跑Hungary就好了。

注意如果中间有点匹配不到了就要直接停止,输出答案(因为无法做到连续递增了)。

就这样。颓废产物。

#include 
#include
#include
using namespace std;const int MAXN=1010010,MAXM=2000010;bool vis[MAXN];int n,m,cnt,ans,head[MAXN],match[MAXN];struct edge{ int nxt,to;}e[MAXM];void AddEdge(int u,int v){ e[++cnt].nxt=head[u]; e[cnt].to=v; head[u]=cnt;}void AddEdges(int x,int y,int v){ AddEdge(x,v),AddEdge(y,v);}int max3(int a,int b,int c){ return max(max(a,b),c);}bool DFS(int u){ for(int i=head[u],v;i;i=e[i].nxt) if(!vis[v=e[i].to]) { vis[v]=1; if(!match[v] || DFS(match[v])) { match[u]=v,match[v]=u; return 1; } } return 0;}void Hungary(void){ for(int i=1;i<=m;++i) if(!match[i]) { memset(vis,0,sizeof vis); if(DFS(i)) ++ans; else break; } printf("%d\n",ans);}int main(int argc,char *argv[]){ scanf("%d",&n); for(int i=1,x,y;i<=n;++i) { scanf("%d %d",&x,&y); AddEdges(x,y,i+10000); m=max3(m,x,y); } Hungary(); return 0;}

谢谢阅读。

转载于:https://www.cnblogs.com/Capella/p/8289334.html

你可能感兴趣的文章
NSEnumerator用法小结
查看>>
redhat 7 源码安装 mysql5.5.49
查看>>
技术项目,问题
查看>>
Android官方技术文档翻译——ApplicationId 与 PackageName
查看>>
Feign使用Hystrix无效原因及解决方法
查看>>
Sam做题记录
查看>>
hexo 搭建博客
查看>>
建造者模式(屌丝专用)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
C++的引用
查看>>
python itertools
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
文件操作
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
graphite custom functions
查看>>
ssh无密码登陆屌丝指南
查看>>
一个自己写的判断2个相同对象的属性值差异的工具类
查看>>
[CF803C] Maximal GCD(gcd,贪心,构造)
查看>>
oracle连接的三个配置文件(转)
查看>>