洛谷P1640 SCOI2010 连续攻击游戏 (并查集/匹配)
本题介绍两种做法;
1 并查集
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1000005;
4 int fa[N],n;
5 bool vis[N];
6
7 int getf(int a){
8 if(fa[a]==a) return a;
9 else return fa[a]=getf(fa[a]);
10 }
11
12 void mg(int a,int b){
13 int af=getf(a);
14 int bf=getf(b);
15 if(af==bf) vis[af]=true;
16 else{
17 if(af<bf) swap(af,bf);
18 vis[bf]=true;
19 fa[bf]=af;
20 }
21 }
22
23 int main()
24 {
25 memset(vis,false,sizeof(vis));
26 cin>>n;
27 for(int i=1;i<=n+1;i++) fa[i]=i;
28 for(int i=1;i<=n;i++){
29 int a,b;
30 cin>>a>>b;
31 mg(a,b);
32 }
33 for(int i=1;i<=n+1;i++){
34 if(!vis[i]){
35 cout<<i-1;
36 break;
37 }
38 }
39 return 0;
40 }
2 更普遍的做法,也是更容易想到的,用二分图匹配来做,
将每个武器的两个属性分别向武器连边,因为是连续攻击(即从1开始),我们从1开始匹配,直到不能匹配为止,此时就得到答案。
代码中T表示时间戳,代替了匈牙利算法每次的memset(vis)。
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1000005;
4 int adj[N],lk[N],id[N];
5 int to[2*N],nex[2*N];
6 int T,tot;
7
8 int read()
9 {
10 int a=0,f=1; char c=getchar();
11 while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
12 while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
13 return a*f;
14 }
15
16 void ins(int x,int y){
17 nex[++tot]=adj[x];
18 adj[x]=tot;
19 to[tot]=y;
20 }
21
22 bool mt(int x){
23 for(int i=adj[x];i;i=nex[i]){
24 int v=to[i];
25 if(id[v]==T) continue;
26 id[v]=T;
27 if(!lk[v]||mt(lk[v])){
28 lk[v]=x;
29 return 1;
30 }
31 }
32 return 0;
33 }
34
35 int main(){
36 int n=read(),i,x,y;
37 for(i=1;i<=n;i++) {
38 x=read();y=read();
39 ins(x,i);ins(y,i);
40 }
41 for(i=1;i<=10000;i++){
42 T++;
43 if(!mt(i)) break;
44 }
45 cout<<i-1;
46 return 0;
47 }
洛谷P1640 SCOI2010 连续攻击游戏 (并查集/匹配)的更多相关文章
- 洛谷 P1640 SCOI2010 连续攻击游戏 并查集
题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...
- 洛谷 P1640 [SCOI2010]连续攻击游戏 解题报告
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
- 洛谷——P1640 [SCOI2010]连续攻击游戏
P1640 [SCOI2010]连续攻击游戏 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备 ...
- 洛谷—— P1640 [SCOI2010]连续攻击游戏
https://www.luogu.org/problem/show?pid=1640 题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1, ...
- 洛谷P1640 [SCOI2010]连续攻击游戏(二分图)
题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...
- 洛谷P1640 [SCOI2010]连续攻击游戏 题解
题目链接: https://www.luogu.org/problemnew/show/P1640 分析: 这道题用二分图来解决即可.应该可以作为网络流中的模板题来食用, 每一个武器有两个属性,但是只 ...
- [洛谷P1640][SCOI2010]连续攻击游戏
题目大意:有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.每种装备最多只能使用一次,且只能使用其中一种属性.装备所使用的属性值必须从1开始连续.问最多能攻击多少次? ...
- 洛谷 P1640 [SCOI2010]连续攻击问题
洛谷 一句话题意: 每个武器有两种属性,每种武器只能选择一种属性,从属性1连续递增才算攻击,求最大连续攻击次数. 因为同学告诉我这是二分图最大匹配,自然就往那个方向去想. 那么怎么建图呢? 每个武器只 ...
- 洛谷 P1640 【连续攻击游戏】
question bank :luogu question Number :1640 title :Continuous attacking game link :https://www.luogu. ...
随机推荐
- DelayQueue达到定时触发效果
DelayQueue的特点就是插入Queue中的数据可以按照自定义的delay时间进行排序.只有delay时间小于0的元素才能够被取出. 这样子,只要开启一个线程循环从DelayQueue中取值执行, ...
- 两个比较好用的JS方法,用来处理树形结构!
一.平级结构转树形结构 /** * 平级结构转树形结构 * * 示例:const jsonDataTree = listTransToTreeData(jsonData, 'id', 'pid', ' ...
- React + Antd Menu组件实现菜单树
准备好两个变量,一个用来保存平级菜单列表,一个用来保存遍历后的菜单树. 推荐后端返回平级菜单树,假如菜单比较多,可以直接结合find方法找到菜单,做搜索功能很省事. const [menuList, ...
- Java面试题(六)--Redis
1 Redis基础篇 1.简单介绍一下Redis优点和缺点? 优点: 1.本质上是一个 Key-Value 类型的内存数据库,很像memcached 2.整个数据库统统加载在内存当中进行操作,定期通过 ...
- 如何在CDH5上部署Dolphin Scheduler 1.3.1
点击蓝色字关注! 本篇文章大概8440字,阅读时间大约20分钟 本文记录了在CDH5.16.2集群上集成Dolphin Scheduler 1.3.1的详细流程,特别注意一下MySQL数据库的连接串! ...
- 【AGC】引导用户购买提升用户留存率
借助AGC的云数据库.云托管.应用内消息.App Linking等服务,您可以给不同价值用户设置不同的优惠套餐活动,引导用户持续购买,增强用户黏性.判断用户价值,发送营销短信,引导用户参与营销活动,提 ...
- 使用 Golang 代码生成图表的开源库对比
本文的目标读者 对用 Golang 代码生成折线图.扇形图等图表有兴趣的朋友. 本文摘要 主要介绍 Go 中用以绘图的开源库,分别是: GitHub - wcharczuk/go-chart: go ...
- 硬件错误导致的crash
[683650.031028] BUG: unable to handle kernel paging request at 000000000001b790--------------------- ...
- [CF1498D] Bananas in a Microwave (DP)
题面&翻译 题解 虽然 m m m 很大,但是 n n n 很小,因此题目允许我们在 O ( n m ) O(nm) O(nm) 以内解决这道题. 定义一个 dp[i][j]=0/1 ? 如果 ...
- 「题解报告」 P3167 [CQOI2014]通配符匹配
「题解报告」 P3167 [CQOI2014]通配符匹配 思路 *和?显然无法直接匹配,但是可以发现「通配符个数不超过 \(10\) 」,那么我们可以考虑分段匹配. 我们首先把原字符串分成多个以一个通 ...