BZOJ 1854 游戏

SCOI省选题。

第一种做法是二分图匹配,即属性向装备连边,一旦不能匹配输出即可。

第二种做法是并查集。装备当作边连接两个点,如果某x条边没有环,它最大那个一定找不到属于自己的边。因此一旦某个点所在并查集中无环且最大的点是自己那么就可以输出答案了。

都很短。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define maxl 5050
#define maxr 2000050
#define maxe 5000050
using namespace std;
struct edge
{
int v,nxt;
}e[maxe];
int n,g[maxr],x,y,linker[maxr],nume=0,cnt=0;
int used[maxr];
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
bool dfs(int u)
{
for (int i=g[u];i;i=e[i].nxt)
{
int v=e[i].v;
if (used[v]==cnt) continue;
used[v]=cnt;
if ((linker[v]==-1)||(dfs(linker[v])==true))
{
linker[v]=u;
return true;
}
}
return false;
}
int main()
{
memset(g,0,sizeof(g));
memset(linker,-1,sizeof(linker));
memset(used,0,sizeof(used));
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
addedge(x,i);
addedge(y,i);
}
int rec=0;
for (int i=1;i<=10000;i++)
{
cnt++;
if (dfs(i)==true) rec++;
else break;
}
printf("%d\n",rec);
return 0;
}

时间: 2024-10-09 22:31:55

BZOJ 1854 游戏的相关文章

BZOJ 1854 游戏(二分图匹配或并查集)

此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个题需要常数优化,不能每次都fillchar一遍used数组.可以用队列将使用的used点加入,然后需要初始化的时候弹出即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <i

【BZOJ 1854】 [Scoi2010]游戏

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

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]游戏 并查集

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】 游戏

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

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遇到了终极bo

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

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

●BZOJ 1854 [Scoi2010]游戏

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

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