P1640 [SCOI2010]连续攻击游戏(二分图最大匹配)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1640 [SCOI2010]连续攻击游戏(二分图最大匹配)相关的知识,希望对你有一定的参考价值。

P1640 [SCOI2010]连续攻击游戏(二分图最大匹配)

二分图最大匹配问题,限制是需要匹配的属性值连续。

维护一个当前数字 n o w now now,同时vis不用再每次memst,而是与now比较。

当不能找到匹配时直接break。

code

// Problem: P1640 [SCOI2010]连续攻击游戏
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1640
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-07-05 21:08:18
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=1e6+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
int n;
struct edge{
	int to,nt;
}e[N<<1];
int h[N],cnt;
void add(int u,int v){
	e[++cnt]={v,h[u]},h[u]=cnt;
}
int vis[N],now,mh[N];
bool find(int u){
	for(int i=h[u];i;i=e[i].nt){
		int v=e[i].to;
		if(vis[v]==now) continue;//不用每次初始化
		vis[v]=now;
		if(!mh[v]||find(mh[v])){
			mh[v]=u;
			return true;
		}
	}
	return false;
}
int main(){
	scanf("%d",&n);
	for(int i=1,u,v;i<=n;i++){
		scanf("%d%d",&u,&v);add(u,i),add(v,i);
	}
	int ans=0;
	for(int i=1;i<=10001;i++){
		now++;
		if(find(i)) ans++;
		else break;
	}
	printf("%d\\n",ans);
	return 0;
}

以上是关于P1640 [SCOI2010]连续攻击游戏(二分图最大匹配)的主要内容,如果未能解决你的问题,请参考以下文章

P1640 [SCOI2010]连续攻击游戏

P1640 [SCOI2010]连续攻击游戏 二分图最大匹配 匈牙利算法

[P1640][SCOI2010]连续攻击游戏

洛谷——P1640 [SCOI2010]连续攻击游戏

并查集 洛谷P1640 [SCOI2010]连续攻击游戏

P1640 [SCOI2010]连续攻击游戏