bzoj1854 游戏题解(二分图/并查集)
1854: [Scoi2010]游戏
Time Limit: 5 Sec Memory Limit: 162 MB
Submit: 5547 Solved: 2229
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2
3 2
4 5
Sample Output
HINT
【数据范围】
对于30%的数据,保证N < =1000
对于100%的数据,保证N < =1000000
Source
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define N 1000005
using namespace std;
int n,zz,a[N];
struct ro
{
int to,next;
}road[N*];
void build(int x,int y)
{
zz++;
road[zz].to=y;
road[zz].next=a[x];
a[x]=zz;
}
int b[N];
bool fw[N],fw2[N];
bool find(int x)
{
for(int i=a[x];i>;i=road[i].next)
{
int y=road[i].to;
if(!fw[y])
{
fw[y]=;
if(!b[y])
{
b[y]=x;
return ;
}
}
}
for(int i=a[x];i>;i=road[i].next)
{
int y=road[i].to;
if(!fw2[y])
{
fw2[y]=;
if(find(b[y]))
{
b[y]=x;
return ;
}
}
}
return ;
}
int js[N];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
js[x]++,js[y]++;
build(x,i);
build(y,i);
}
int ans=;
for(int i=;i<=min(n,);i++)
{
if(!js[i])break;
memset(fw,,sizeof(fw));
memset(fw2,,sizeof(fw2));
if(find(i))ans++;
else break;
}
printf("%d\n",ans);
return ;
}
二分图代码
下面我来说一下正解:并查集。
当时在思考时并不是没想到过并查集,但如何去保证递增这个条件没想出来,然后就放弃这个思路了。合并那些并查集十分好说,毕竟怎么搞也只能从武器的两个权值做文章那如何保证递增呢?
首先我们明确一个性质当当前连通块是一个树时,如果我们再去加一个边这个图中一定有一个环,而如果所有边都是双向边,我们可以满足每一个点都可以和一个与之相连的边配对且所有边不重复。
那么当我们在并查集合并的时候,我们可以分类讨论,如果说两个节点所属同一个并查集,那么这个并查集里所有的点都可以被满足,如果两个点属于不同并查集,那么我们根据递增的要求,首先看编号小的并查集是否已经被满足,若被满足我们就去满足大的,否则就去满足小的就好了。在合并时我们应当把大的作为小的的fa,否则我们每次满足的标记都只能打给最小的,无法真正更新答案。
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define N 1000005
using namespace std;
int n,fa[N];
bool vi[N];
int find(int x)
{
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void hb(int x,int y)
{
int a=find(x),b=find(y);
if(a>b)swap(a,b);
if(a==b) vi[a]=;
else
{
if(!vi[a]) vi[a]=;
else vi[b]=;
fa[a]=b;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=;i++)
fa[i]=i;
for(int i=;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
hb(x,y);
}
for(int i=;i<=;i++)
{
if(!vi[i])
{
printf("%d\n",i-);
break;
}
}
return ;
}
并查集打法
bzoj1854 游戏题解(二分图/并查集)的更多相关文章
- bzoj1854 [Scoi2010]游戏【构图 并查集】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1854 没想到怎么做真是不应该,看到每个武器都有两个属性,应该要想到连边构图的!太不应该了! ...
- Cogs 1070. [焦作一中2012] 玻璃球游戏 带权并查集,逆序处理
题目: http://cojs.tk/cogs/problem/problem.php?pid=1070 1070. [焦作一中2012] 玻璃球游戏 ★ 输入文件:marbles.in 输出 ...
- 【BZOJ1594】[Usaco2008 Jan]猜数游戏 二分答案+并查集
[BZOJ1594][Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在 ...
- AcWing 239.奇偶游戏 (带权并查集/种类并查集)
题意:你和朋友玩游戏,有个一\(01\)序列,你每次给出一个区间,朋友会回答这个区间中的\(1\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...
- 【BZOJ5005】乒乓游戏 [线段树][并查集]
乒乓游戏 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output Sample Input 5 1 1 5 1 5 11 2 ...
- 洛谷P5092 [USACO2004OPEN]Cube Stacking 方块游戏 (带权并查集)
题目描述 约翰和贝茜在玩一个方块游戏.编号为 1\ldots n 1-n 的 n n ( 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱. 游戏开始 ...
- CDOJ 1070 秋实大哥打游戏 带权并查集
链接 F - 秋实大哥打游戏 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submit ...
- 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集
这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. ...
随机推荐
- 获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- FC红白机游戏列表(维基百科)
1055个fc游戏列表 日文名 中文译名 英文版名 发行日期 发行商 ドンキーコング 大金刚 Donkey Kong 1983年7月15日 任天堂 ドンキーコングJR. 大金刚Jr. Donkey K ...
- Android 开发中,as或者idea对gradle的使用
原文:Android 开发中,as或者idea对gradle的使用 本文属于转载收藏,侵删,出处:私人博客 ---------------------------------------------- ...
- Android实现简单音乐播放器(startService和bindService后台运行程序)
Android实现简单音乐播放器(MediaPlayer) 开发工具:Andorid Studio 1.3运行环境:Android 4.4 KitKat 工程内容 实现一个简单的音乐播放器,要求功能有 ...
- Delphi访问活动目录(使用COM,活动目录Active Directory是用于Windows Server的目录服务)
活动目录Active Directory是用于Windows Server的目录服务,它存储着网络上各种对象的有关信息,并使该信息易于管理员和用户查找及使用.Active Directory使用结构化 ...
- Qt Style Sheet实践(二):组合框QComboBox的定制(24K纯开源)——非常漂亮
组合框是一个重要且应用广泛的组件,一般由两个子组件组成:文本下拉单部分和按钮部分.在许多既需要用户选择.又需要用户手动输入的应用场景下,组合框能够很好的满足我们的需求.如我们经常使用的聊天软件QQ登录 ...
- Ruby元编程:执行某个目录下的全部测试用例
目前手里有个测试项目各个feature的测试用例都放在对应的子目录下,虽然有自动化测试框架的帮助执行起来很方便,但是偶尔也有需要在本地执行某个feature的全部测试用例集合.因为本人对shell脚本 ...
- 自己动手写jQuery插件---Tip(提示框)
对jQuery相信很多同学和我一样平时都是拿来主义,没办法,要怪只能怪jQuery太火了,各种插件基本能满足平时的要求.但是这毕竟不是长久之道,古人云:“授之以鱼,不如授之以渔”. 为了方便之前没有接 ...
- javaweb各种框架组合案例(二):maven+spring+springMVC+mybatis
1.mybatis是比较新的半自动orm框架,效率也比较高,优点是sql语句的定制,管理与维护,包括优化,缺点是对开发人员的sql功底要求较高,如果比较复杂的查询,表与表之间的关系映射到对象与对象之间 ...
- Eclipse远程代码调试
前提:远程服务器上运行的WEB项目class对应的源码与本地项目中必须保持一致 也就是远程tomcat部署的项目就是本机项目打包过去的,而本机项目没有发生变动. 1.配置$tomcat_home/bi ...