(并查集)食物链

题目:

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。
现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。
有人用两种说法对这N个动物所构成的食物链关系进行描述:
第一种说法是”1 X Y”,表示X和Y是同类。
第二种说法是”2 X Y”,表示X吃Y。
此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。
1) 当前的话与前面的某些真的话冲突,就是假话;
2) 当前的话中X或Y比N大,就是假话;
3) 当前的话表示X吃X,就是假话。
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。
Input
第一行是两个整数N和K,以一个空格分隔。
以下K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,其中D表示说法的种类。
若D=1,则表示X和Y是同类。
若D=2,则表示X吃Y。
Output
只有一个整数,表示假话的数目。
Sample Input
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
Sample Output
3

分析与解答:

每个动物都可以成为abc三个种类的任意一个。

我如果用数组a[3*n]表示一个动物的三个种类,就是说如果动物标号为x,那么a[x]表示种类1,a[x+n]表示种类2,a[x+2*n]表示种类3

如果两个动物种类相同,那么假如第一个动物种类是a,那么第二个动物种类一定是a,假如第一个动物种类是b,那么第二个动物种类一定是b,假如第一个动物种类是c,那么第二个动物种类一定是c。

也就是说无论他俩是a还是b还是c,都一定属于同一个集合。

用图形表示的话
这里写图片描述

如果第1个动物吃第2动物,那么我们假设出来所有可能情况,
a1吃b2,a2吃b3,a3吃b1. 因为这些可能情况可能发生,我么假设他们每个情况在同一个路径里面,就是说a1b2在一组,a2b3在一组,a3b1在一组

我们发现,如果用图形表示现在我们的推论,应该是这样的:

这里写图片描述

由于食物链的缘故
1吃2,2吃3.如果现在3吃1,那么说明满足自洽性

这里写图片描述

根据路径关系,我们发现如果1吃3,则不成立,反而3吃1成立,所以可见我们食物链满足

当我们碰到属于同一类时,如果a1和b2在同一路径,a1和b3在同一路径那我们就要退出,碰到a吃b时,如果a1和b1在同一路径,a1和b3在同一路径,我们就要退出.这里同一路径意思是在同一集合里
如满足条件,那么我们就连接上面图像上相连的那几个结点,所谓连接就是加入到同一个集和里。
这里我们根本没考虑谁吃谁,而是直接加到集合里,这就是连接方法的问题,从连接方式一看就知道谁吃谁了

上面这一切说明什么呢,可以通过并查集模拟路径,可以在输入路径的同时判断是不是和之前已有路径的产生矛盾
目前我只是抛砖引玉。
现在我思考这几个部分:1.实物个数,2.实物种类,3.种类间关系,4.操作信息
未来我会整合一下让这个算法更普适化。

代码参考:
https://blog.csdn.net/yoer77/article/details/62882150 以及《挑战程序设计竞赛》

#include <iostream>
#include <cstdio>
#define MAX_N 500000
using namespace std;int pre[MAX_N];
int N, K;
int ans = 0;
void init(int n) {for (int i = 1; i <= n*3; i++) {pre[i] = i;}
}int find(int x) {int r=x;while ( pre[r] != r )                           r=pre[r];int i=x , j ;while( i != r )       //压缩路径              {j = pre[ i ];               pre[ i ]= r ;               i=j;                       }return r ;
}void unite(int x, int y) {int fx=find(x),fy=find(y);if(fx!=fy)pre[fx ]=fy;
}int main() {int T, X, Y;cin >> N >> K;init(3 * N);for (int i = 0; i < K; i++) {scanf("%d%d%d", &T, &X, &Y);if (X <= 0 || N < X || Y <= 0 || N < Y) {ans++;continue;}if (T == 1) {if (find(X) == find(Y + N) || find(X) == find(Y + 2 * N)) {ans++;continue;}else {unite(X, Y);unite(X + N, Y + N);unite(X + 2 * N, Y + 2 * N);}}else {if (find(X) == find(Y) || find(X) == find(Y + 2 * N)) {ans++;continue;}else {unite(X, Y + N);unite(X + N, Y + 2 * N);unite(X + 2 * N, Y);}}}cout << ans << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程销售问题java_Java多线程Runable售票系统实现过程解析

一、无等待&#xff0c;直接出票【虽然解决了不会冲票问题&#xff0c;但显然不符合实际生活】&#xff1a;package com.thread.sale;public class Sale {public static void main(String[] args) {//悟&#xff0c;那么设计爬虫的时候&#xff0c;下载的资源唯一&#xff0c;使…

(并查集)Wireless Network

问题&#xff1a; 地震发生在东南亚。 ACM&#xff08;亚洲合作医疗团队&#xff09;已经与膝上电脑建立了无线网络&#xff0c;但是一次意外的余震袭击&#xff0c;网络中的所有计算机都被打破了。计算机一个接一个地修复&#xff0c;网络逐渐开始工作。由于硬件限制&#xf…

mysql 索引空间大小_查看数据库表中容量大小,表有多少记录,占多少空间以及索引的大小,以及未使用空间...

直接在sqlserver查询窗执行就OK了&#xff0c;也是网上看到的&#xff0c;对日常管理数据库工作者来说也蛮有用的&#xff0c;可以及时的清理冗余的数据&#xff0c;缓解数据库服务器的压力。Create Table #TableSpaceInfo --创建结果存储表(NameInfo NVarchar(50) ,RowsInfo i…

带权并查集-Building Block

题目&#xff1a; John are playing with blocks. There are N blocks (1 < N < 30000) numbered 1…N。Initially, there are N piles, and each pile contains one block. Then John do some operations P times (1 < P < 1000000). There are two kinds of ope…

怎么解决缺少java.doc_java 生成doc帮助文档时出现的问题

正在加载程序包com.csust.czj的源文件...正在构造 Javadoc 信息...标准 Doclet 版本1.7.0_03正在构建所有程序包和类的树...正在生成D:\EclipseProject\TankWar2.7\doc\com\csust\czj\Blood.html...java.lang.IllegalArgumentExceptionat sun.net.www.ParseUtil.decode(ParseUt…

(最短路)Shopping

你刚搬进一套新公寓&#xff0c;有一长串你需要买的东西。不幸的是&#xff0c;买这么多东西需要去很多不同的商店。你想尽量减少购买所需物品所需的驾驶时间。 你的城市被组织成一组由道路连接的十字路口。你的房子和每家商店都在某个十字路口。你的任务是找到从你家出发的最…

java 设计char类型_JAVA中的char类型

1、JAVA中&#xff0c;char占2字节&#xff0c;16位。可在存放汉字2、char赋值char aa; //任意单个字符&#xff0c;加单引号。char a中;//任意单个中文字&#xff0c;加单引号。char a111;//整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。注&am…

(dijkstra记录路径)find the longest of the shortest

Marica对Mirko很生气&#xff0c;因为他找到了一个新的女朋友&#xff0c;她想报仇。由于她不住在同一个城市&#xff0c;她开始为长途旅行做准备。我们知道每条路从一个城市到另一个城市需要多少分钟。 米尔科在车里无意中听到其中一条路正在维修&#xff0c;路被堵住了&…

友元是c还是java_[C++]【类】友元的三种声明及注意事项

类允许其他类或者函数访问它的非公有成员&#xff0c;但我们需要将访问类非公有成员的其他类或者函数成为它的友元。一、友元函数如果类想要把一个函数作为他的友元&#xff0c;只需要增加一条以 friend 关键字开始的函数声明语句即可。例如&#xff1a;class A{friend void fr…

(SPFA+最短路变形+回路对起点的影响)Arbitrage

套利是利用货币汇率的差异将一种货币的一个单位转换为同一货币的多个单位。例如&#xff0c;假设1美元兑0.5英镑&#xff0c;1英镑兑10.0法国法郎&#xff0c;1法国法郎兑0.21美元。然后&#xff0c;通过兑换货币&#xff0c;一个聪明的交易者可以从1美元开始购买0.5 * 10.0 * …

java 金庸群侠传_《金庸群侠传》MOD发展史(官方版本 转自铁血丹心论坛)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼三、MOD初期在事件修改器和场景编辑器被制作出来之后&#xff0c;修改档的制作被引向了新的方向。(此后包括事件修改的“修改档”即可称之为“MOD”&#xff0c;但由于修改的量比较小&#xff0c;故以“初期”命名)这一时期的第一个…

(模拟+floyd)Saving James Bond

题目&#xff1a; This time let us consider the situation in the movie “Live and Let Die” in which James Bond, the world’s most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake filled with…

python从数据库取数据 显示字段名_如何在python中将SQL数据库中的字段名放入列表中...

以下是我目前掌握的代码&#xff1a;from ConfigParser import *import MySQLdbconfiguration ConfigParser()configuration.read(someconfigfile.conf)db MySQLdb.connect(host configuration.get(DATABASE, MYSQL_HOST),user configuration.get(DATABASE, MYSQL_USER),pa…

详解最短路算法模板(dijkstra+floyd+spfa)

1.Floyd_Warshall算法 核心思路&#xff1a;d[i][j] min{d[i][j], d[i][k] d[k][j]} 从i到j有两种路径&#xff0c;经过k点或是不经过k点&#xff0c;所以我们枚举k即可求所有路的最短路。 适用范围&#xff1a;求任意两点间的最短路&#xff0c;可以有负权&#xff0c;可以…

tomcat java垃圾回收_tomcat启动参数配置,内存和垃圾回收

一般情况下&#xff1a;JAVA_OPTS-Xms2048m -Xmx2048m -XX:MaxPermSize512m -XX:UseParallelGC -XX:ParallelGCThreads8 -XX:UseParallelOldGC -Xloggc:../logs/jvm-gc.log -XX:PrintGCDetails -XX:PrintGCTimeStamps适合于实时要求比较高&#xff1a;-Xms2048m -Xmx2048m -Xmn…

(dijkstra算法+多权值)最短路径问题

给你n个点&#xff0c;m条无向边&#xff0c;每条边都有长度d和花费p&#xff0c;给你起点s终点t&#xff0c;要求输出起点到终点的最短距离及其花费&#xff0c;如果最短距离有多条路线&#xff0c;则输出花费最少的。 Input 输入n,m&#xff0c;点的编号是1~n,然后是m行&am…

java 重定向关键字_SpringMVC 转发、重定向

转发、重定向到其它业务方法org.springframework.stereotype.ControllerRequestMapping("/userController")public classUserController{RequestMapping("/handler1")public String handler1() throwsIOException {//转发给handler2处理return "forwa…

(多源转化成单源dijsktra)一个人的旅行

虽然草儿是个路痴&#xff08;就是在杭电待了一年多&#xff0c;居然还会在校园里迷路的人&#xff0c;汗~),但是草儿仍然很喜欢旅行&#xff0c;因为在旅途中 会遇见很多人&#xff08;白马王子&#xff0c;^0^&#xff09;&#xff0c;很多事&#xff0c;还能丰富自己的阅历&…

最短路模板题

题目&#xff1a; 在每年的校赛里&#xff0c;所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候&#xff0c;却是非常累的&#xff01;所以现在他们想要寻找最短的从商店到赛场的路线&#xff0c;你可以帮助他们吗…

php 取经纬度,php根据地址获取百度地图经纬度的实例方法

首先我们来看全部实例代码&#xff1a;/*** param string $address 地址* param string $city 城市名* return array*/function getLatLng($address‘‘,$city‘‘){$result array();$ak ‘‘;//您的百度地图ak&#xff0c;可以去百度开发者中心去免费申请$url "http://…