暑假D14 [SCOI2010]连续攻击游戏(二分图)
Posted sto324
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假D14 [SCOI2010]连续攻击游戏(二分图)相关的知识,希望对你有一定的参考价值。
题意
有n个武器,每个武器有两个属性,求能得到从1开始的最长的连续属性是多少。
属性<=1e4,n<=1e6
题解
讲这道题的时候,说是二分图,想了半天愣是不知道怎么建图,不知道分成哪两部分。
后来一看题解才恍然大悟,把武器和属性分在两边,再属性和武器之间连边,那么从1开始一直做最大匹配,找不到增广路就停止。
还是比较巧妙吧(对于我),其实也应该想到(就只有武器和属性两种东西),不过可能是想到两边不均衡(蠢哭),还有就是才发现以前的代码建的双向边,好像不用(毒瘤lrd?),接着就是vis数组必须要,其实对二分图的模板更理解了一些。
#include<bits/stdc++.h> using namespace std; const int maxn=10005; const int maxm=1000005; int n,m,ans,timer; int match[maxm],vis[maxm+maxn]; vector<int>e[maxn+maxm]; bool dfs(int u) if(vis[u]==timer) return false; vis[u]=timer; for(unsigned int i=0;i<e[u].size();i++) int v=e[u][i]; if(!match[v]||dfs(match[v])) match[v]=u; return true; return false; int main() scanf("%d",&n); for(int i=1;i<=n;i++) int x,y; scanf("%d%d",&x,&y); e[n+x].push_back(i); e[n+y].push_back(i); m=max(m,max(x,y)); for(int i=n+1;i<=n+m;i++) ++timer; if(dfs(i)) ans++; else break; printf("%d",ans);
以上是关于暑假D14 [SCOI2010]连续攻击游戏(二分图)的主要内容,如果未能解决你的问题,请参考以下文章
[luogu1640 SCOI2010]连续攻击游戏 (二分图匹配)