标签:装备 bsp lan target problem ref ons c++ 最大匹配
可以发现这道题其实是属性值集合和装备集合的对应,且每个点只能用一次
那么就能想到二分图最大匹配,一旦不可行直接退出就行了
Tip:
1、$Hungry$算法连有向边就行了……
2、注意左右两个集合范围不同!
#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; }
标签:装备 bsp lan target problem ref ons c++ 最大匹配
原文地址:https://www.cnblogs.com/newera/p/9348195.html