bzoj1854: [Scoi2010]游戏(二分图匹配)
程序员文章站
2022-05-22 13:35:33
...
题目传送门
好题!
解法:
想了一会儿如何限制选了一个另外一个不再选呢?
好像可以用二分图匹配诶。
每个装备的两个属性到这个装备有一个匹配关系。
然后就跑最大匹配就行了嘛。
从1开始,能匹配表示可以攻击到这个属性。
否则的话就不能再继续了。
真的卡时间边目录+时间戳
代码实现:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
int x,y,next;
}a[2100000];int len,last[11100000];
void ins(int x,int y) {
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
int match[11100000],chw[1110000],t;
bool find_match(int x) {
for(int k=last[x];k;k=a[k].next) {
int y=a[k].y;
if(chw[y]!=t) {
chw[y]=t;
if(match[y]==0||find_match(match[y])==true) {
match[y]=x;
return true;
}
}
}
return false;
}
int main() {
int n;scanf("%d",&n);
len=0;memset(last,0,sizeof(last));
int sum=0;
for(int i=1;i<=n;i++) {
int x,y;scanf("%d%d",&x,&y);
ins(x,i);ins(y,i);sum=max(sum,max(x,y));
}
t=0;
int ans=0;
for(int i=1;i<=sum;i++) {
t++;
if(find_match(i)==true)
ans++;
else
break;
}
printf("%d\n",ans);
return 0;
}
上一篇: BZOJ2143: 飞飞侠 最短路
推荐阅读
-
洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)
-
HDU 1281 棋盘游戏(二分图匹配)
-
POJ 1358 Housing Complexes G++ 二分图匹配 没掌握
-
POJ 1719 Shooting Contest G++ 二分图匹配 没掌握
-
loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)
-
[Gym 101666]E - Easter Eggs (二分 + 二分图匹配 + 找最小点覆盖(原图最大团) )
-
洛谷 P3386 【模板】二分图匹配
-
P - 奔小康赚大钱 HDU - 2255(二分图最大权完美匹配)
-
SSL1333 地鼠的困境【二分图匹配】【匈牙利算法】
-
BZOJ1059: [ZJOI2007]矩阵游戏(二分图匹配)