[P1640][SCOI2010]连续攻击游戏
Posted newera
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[P1640][SCOI2010]连续攻击游戏相关的知识,希望对你有一定的参考价值。
Link:
Solution:
可以发现这道题其实是属性值集合和装备集合的对应,且每个点只能用一次
那么就能想到二分图最大匹配,一旦不可行直接退出就行了
Tip:
1、$Hungry$算法连有向边就行了……
2、注意左右两个集合范围不同!
Code:
#include <bits/stdc++.h> using namespace std; const int MAXN=1e4+5;//边数和Y集合点数都为1e6级别 struct edge{int nxt,to;}e[2000005]; int n,x,y,match[1000005],vis[MAXN],head[MAXN],tot; void add(int from,int to) {e[++tot].nxt=head[from];e[tot].to=to;head[from]=tot;} int dfs(int u) { vis[u]=true; for(int i=head[u];i;i=e[i].nxt) { int m=match[e[i].to]; if(m==-1||!vis[m]&&dfs(m)) {match[e[i].to]=u;return 1;} } return 0; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)//Hungry直接连单向边就行了 scanf("%d%d",&x,&y),add(x,i),add(y,i); int res=0;memset(match,-1,sizeof(match)); for(int i=1;i<=10000;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) res++; else break; } printf("%d",res); return 0; }
以上是关于[P1640][SCOI2010]连续攻击游戏的主要内容,如果未能解决你的问题,请参考以下文章