bzoj 1854: [Scoi2010]游戏(二分图的最大匹配)

1854: [Scoi2010]游戏

Time Limit: 5 Sec  Memory Limit: 162 MB

Submit: 3695  Solved: 1405

[Submit][Status][Discuss]

Description

lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示。当他使用某种装备时,他只能使用该装备的某一个属性。并且每种装备最多只能使用一次。 游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很奇怪,攻击他的装备所使用的属性值必须从1开始连续递增地攻击,才能对boss产生伤害。也就是说一开始的时候,lxhgww只能使用某个属性值为1的装备攻击boss,然后只能使用某个属性值为2的装备攻击boss,然后只能使用某个属性值为3的装备攻击boss……以此类推。
现在lxhgww想知道他最多能连续攻击boss多少次?

Input

输入的第一行是一个整数N,表示lxhgww拥有N种装备 接下来N行,是对这N种装备的描述,每行2个数字,表示第i种装备的2个属性值

Output

输出一行,包括1个数字,表示lxhgww最多能连续攻击的次数。

Sample Input

3

1 2

3 2

4 5

Sample Output

2

HINT

【数据范围】

对于30%的数据,保证N < =1000

对于100%的数据,保证N < =1000000

Source

Day1

[Submit][Status][Discuss]
题解: 二分图的最大匹配.

因为所有属性的权值只用选择一次,而所有武器只能选择其中的一个属性,所有从一个武器的两个属性分别向这个武器连边,跑匈牙利算法即可.(貌似网上有写并查集的).

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define N 3200000
#define M 1200000
#define inf 1000000000
using namespace std;
int next[N*2],v[N*2],remain[N*2];
int point[M];
int belong[M],cur[M];
int n,tot;
void add(int x,int y)
{
	tot++; next[tot]=point[x]; point[x]=tot; v[tot]=y;
}
int dfs(int x)
{
	for (int i=point[x];i;i=next[i])
	 {
	 	int t=v[i];
	 	if (cur[t]==i) continue;
	 	cur[t]=i;
	 	if (!belong[t]||dfs(belong[t]))
	 	 {
	 	 	belong[t]=x;
	 	 	return true;
	 	 }
	 }
	 return false;
}
int main()
{
	scanf("%d",&n);
	int maxn=0;
	for (int i=1;i<=n;i++)
	 {
	 	int x,y; scanf("%d%d",&x,&y);
	 	add(x,i);
	 	add(y,i);
	 	maxn=max(maxn,x); maxn=max(maxn,y);
	 }
	memset(belong,0,sizeof(belong));
	for (int i=1;i<=maxn;i++)
	 {
	 	if (!dfs(i))
	 	 {
	 	 	printf("%d\n",i-1);
	 	 	return 0;
	 	 }
	 }
	printf("%d\n",maxn);
}
时间: 2024-10-06 11:45:24

bzoj 1854: [Scoi2010]游戏(二分图的最大匹配)的相关文章

BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )

匈牙利算法..从1~10000依次找增广路, 找不到就停止, 输出答案. ---------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int MAXL = 10009, MAXR = 1000009; struct edge { int to; edge* next; } E[MAXR <<

BZOJ 1854 SCOI2010 游戏 二分图最大匹配/并查集

题目大意:给定n个武器,每个武器有两个属性,只能使用其中一个,要求选择一些武器 可以造成形如1 2 3 4的伤害 求最大伤害 题目大意我没写明白还是去看原题把QAQ 做法1: 同 1191 每个武器向两个属性连边 然后从1~10000枚举属性 跑二分图最大匹配 无法匹配则输出答案 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 100100

BZOJ 1854: [Scoi2010]游戏 并查集

1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2672  Solved: 958[Submit][Status][Discuss] Description lxhgww 最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使 用该装备的某一个属性.并且每种装备最多只能使用一次. 游戏进行到最后,lxhgww遇到了终极bos

bzoj 1854: [Scoi2010]游戏 (并查集||二分图最大匹配)

链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1854 写法1: 二分图最大匹配 思路:  将武器的属性对武器编号建边,因为只有10000种属性,我们直接对1-10000跑二分图匹配,同时用时间戳优化匹配. 实现代码: #include<bits/stdc++.h> using namespace std; const int M = 1e6+10; vector<int>g[M]; int vis[M],pre[M],t

BZOJ 1854: [Scoi2010]游戏 [连通分量 | 并查集 | 二分图匹配]

题意: 有$n \le 10^6$中物品,每种两个权值$\le 10^4$只能选一个,使得选出的所有权值从1递增,最大递增到多少 一开始想了一个奇怪的规定流量网络流+二分答案做法...然而我还不知道怎么规定流量...并且一定会T 然后发现题解中二分图匹配用了匈牙利,可以从小到大找增广路,貌似比较科学 然后发现还有用并查集的,看到“权值是点,装备是边”后突然灵机一动想到一个dfs做法 每个边的两个点可以选择一个 找出每个连通分量,如果里面有环或重边那么这里面所有点都可以选 如果是树的话,必须放弃一

●BZOJ 1854 [Scoi2010]游戏

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1854 题解: 并查集(还可以用匈牙利算法进行单路增广的二分图匹配) 把每个武器看成是一条边,每个伤害值看成是一个点,那么每一条边就连接了两个点.并把一条边e与其一个端点u的"对应"表示为用这个武器e打出伤害u. 对于一个联通块,我们考虑把点和边一一对应,使得被对应的点尽量多.1).对于一棵树来说,就会有一个点没有边与之对应,令那个点为联通块里编号最大的点. 2).而对于非树图来说

[BZOJ]1854: [Scoi2010]游戏

题目大意:n个装备,每个装备有两个属性值可以二选一,问能选出的最长的从1开始的连续正整数序列.(属性值<=10000,n<=10^6) 思路:匈牙利二分图匹配模板复习,复杂度O(10000^2). #include<cstdio> inline int read() { int x;char c; while((c=getchar())<'0'||c>'9'); for(x=c-'0';(c=getchar())>='0'&&c<='9';)

bzoj 1854: [Scoi2010]游戏【匈牙利算法】

没啥可说的,就是一边属性一边道具建二分图,把两个属性都连到道具上,然后枚举匹配,如果无法匹配就输出,时间戳优化 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1000005; int n,x,y,h[N],cnt,lk[N],v[N],ti; struct qwe { int ne,to; }e[N<<1]; int read()

1854: [Scoi2010]游戏

1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 2538  Solved: 905[Submit][Status] Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使用一次. 游戏进行到最后,lxhgww遇到了终极boss,这个终极boss很