首页 > 其他分享 >#570. 【例4-8】格子游戏 (并查集)

#570. 【例4-8】格子游戏 (并查集)

时间:2023-07-10 11:23:11浏览次数:54  
标签:连通 查集 fu 格子 570 题题 k2 k1 find

#570. 【例4-8】格子游戏

题题题题题题题题题题题题题题

分析:

  • 并查集解决的是连通性(无向图连通分量)和传递性(家谱关系)问题,并且可以动态的维护。抛开格子不看,任意一个图中,增加一条边形成环当且仅当这条边连接的两点已经联通,于是可以将点分为若干个集合,每个集合对应图中的一个连通块。
  • 此题的解题核心就是:两个已连通的点之间,再添加一条边就构成了一个环;,所以此题采用二维并查集来做,如果两个点已连通(祖先相同),那就满足题意,否则的话将这两个点之间建立联系(将这两个点连通起来);
  • 用了一个结构体node去存一个顶点的横坐标、纵坐标,f数组来存一个顶点的结构体信息(f[x][y]:存储(x,y)这个结点的横坐标、纵坐标);在每次输入的一行操作,先判断当前的两点是否已连通,两个已连通的点之间,再添加一条边就构成了一个环;不连通,那就连起来

题解:

#include<bits/stdc++.h>
using namespace std;
int n,m;
struct ji{
	int x,y;
}fu[210][210];//x,y坐标
ji find(ji k){//?
	if(fu[k.x][k.y].x==k.x  &&  fu[k.x][k.y].y==k.y)
		return fu[k.x][k.y];
	return fu[k.x][k.y]=find(fu[k.x][k.y]);
}
void merge(ji k1,ji k2){
	k1=find(k1);
	k2=find(k2);
	fu[k1.x][k1.y]=k2;
}
int main(){
	cin>>n>>m;
	int x,y;
	char c;
	for(int i=1;i<=n;++i){//初始化,每个坐标点为一个嘉足
		for(int j=1;j<=n;++j){
			fu[i][j].x=i;
			fu[i][j].y=j;
		}
	}
	ji k1,k2;
	for(int i=1;i<=m;++i){
		cin>>x>>y>>c;
		if(c=='D'){//连接(x,y)和(x+1,y)俩节点
			k1=find(fu[x][y]);
			k2=find(fu[x+1][y]);
		}
		else{//连接(x,y)和(x,y+1)俩节点
			k1=find(fu[x][y]);
			k2=find(fu[x][y+1]);
		}
		//判断当前两点是否已联通,两个已联通的点之间,再加一条边就构成了一个环
		if(k1.x==k2.x  &&  k1.y==k2.y){
			cout<<i;
			return 0;
		}
		else{//如果不连通就把他连起来
			merge(k1,k2);
		}
	}
	cout<<"draw";//跳出循环没有结果:输出draw
	return 0;
}

标签:连通,查集,fu,格子,570,题题,k2,k1,find
From: https://www.cnblogs.com/tflsghh/p/17540478.html

相关文章

  • 并查集学习笔记
    什么是并查集顾名思义,并查集有两个最主要的作用:合并集合和查询某两个元素是不是在同一个集合内。或者说:并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个......
  • 2023-07-09:给定N、M两个参数, 一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选, 当
    2023-07-09:给定N、M两个参数,一共有N个格子,每个格子可以涂上一种颜色,颜色在M种里选,当涂满N个格子,并且M种颜色都使用了,叫一种有效方法。求一共有多少种有效方法。1<=N,M<=5000。返回结果比较大,请把结果%1000000007之后返回。答案2023-07-09:这两种算法用于计算涂色的......
  • BZOJ 1915: [Usaco2010 Open]奶牛的跳格子游戏 单调队列优化dp
    1915:[Usaco2010Open]奶牛的跳格子游戏TimeLimit: 4Sec  MemoryLimit: 64MBSubmit: 281  Solved: 110[Submit][Status][Discuss]Description奶牛们正在回味童年,玩一个类似跳格子的游戏,在这个游戏里,奶牛们在草地上画了一行N个格子,(3<=N<=250,000),编号为1..N......
  • 可删除的并查集
       当并查集要删除某一个节点时,不能直接修改该节点的根节点p[i]=i,如果这个节点不是叶子节点,会导致子树的根节点改变。而要删除单独一个非叶子节点,普通的并查集不好操作。可以在初始化并查集时将每一个节点都当作一个树,给每一个节点创建一个虚构的根节点,进行加边操作时只修......
  • 【并查集】 HDOJ 4786 Fibonacci Tree
    就是求出搞成最小生成树的最少白边和最多白边的数量。。。。#include<iostream>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<cstdio>#include<algorithm>#include<cstring>#include<......
  • 种类并查集 学习笔记
    用于维护「敌人的敌人是朋友」这类的关系。例题:luoguP2024对于点\(i\in[0,n)\)(我习惯用这种方法编号),假想一个点\(i+n\)是它的食物,则\(i\)捕食\(j\)可以通过合并\(j\)和\(i+n\)实现(即认为\(j\)和\(i+n\)是同类),如此下去,开三倍大小并查集即可。......
  • 可持久化并查集
    因为这个版本感觉特别清楚就写个博客保留一下(可持久化数组,都说是个数组了,那很多用数组维护的东西就都可以可持久化了。可持久化并查集,其实就是用主席树代替了原来的\(fa\)数组和\(dep\)数组,别的都是并查集的操作。注意不能写路径压缩,只能按秩合并,因为一旦路径压缩就可能会涉......
  • 并查集——传新闻
    并查集——传新闻在社交网络中,有n个用户在m个朋友群中相互交流。我们来分析一下在用户之间传播一些新闻的过程。最初,某个编号为x的用户收到新闻,随后他将新闻发送给他的朋友(如果两个人同属于一个或多个朋友群,则两者便是朋友)。而朋友们继续向他们的朋友发送新闻,以此类推,直至......
  • [数据结构]笛卡尔树、ST表、带权并查集
    Cartesiantree(笛卡尔树)1.概念比如拿最小的当根建树,中序遍历是原数组2.性质区间最小值(RMQ),LCA的值,比如上图4和6的LCA是2,表示我们4,6,2这个区间里面的最小值是2找y左边第一个<=y的数就是y往上看第一个向左拐的数3.构造(增量法)对每个前缀考虑我们发现只有右链是......
  • NC235745 拆路 (并查集)
    https://ac.nowcoder.com/acm/problem/235745点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intfa[N],cnt[N],st[N],en[N],a[N],b[N],ans[N];set<pair<int,int>>t;intfind(inti){if(fa[i]==i)returni;......