hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13
了解了种类并查集,同时还知道了一个小技巧,这道题就比较容易了。
其实这是我碰到的第一道种类并查集,实在不会,只好看着别人的代码写。最后半懂不懂的写完了。然后又和别人的代码进行比较,还是不懂,但还是交了。
现在回过头来看,又看了一遍。
题意——
输入——
给出多组测试数据。
每组数据第一行包含两个整数n, m。n表示共有1——n这么多个数,m表示m组提示。
接下来m行,每行包含三个整数a, b, val。表示从a到b这几个数的和为val。
这几组数有可能有冲突,问一共有多少组有冲突的数据。
输出——
输出有冲突的数据的数量。
举例——
10 5
1 10 100
7 10 28
1 3 21
4 6 41
6 6 1
其中前三组数据明确4——6几个数的和为40,而第四组数据表示4——6几个数的和为41,那么这一组数据就是有冲突的。所以这组测试数据的输出为1。
那么分种类就行了。这里其实种类并不明显,或者说并不是标准的种类,只是算法设计上借鉴了种类并查集的思想(也可能是我对这个还不太理解)。这里使用了一个数组来存储n个数之间的相对关系(即a到b的和)。
假如a到b的和为val,a当前所存的值为x,那么b的值修改为x+val,如果b的值已经有了,且!=x+val,那么冲突数+1。
一个小技巧——
除此之外,还有一点需要注意,1——7和7——10不能直接按照1——10进行合并。如果是1——6和7——10,那么可以合并为1——10。所以,我采取的方法是使用a-1和b进行合并。即将1——6看做0——6,将7——10看做6——10,所以合并出来就是0——10。
种类并查集:hdu1829—— http://www.cnblogs.com/mypride/p/4743357.html
小技巧:hdu3461—— http://www.cnblogs.com/mypride/p/4671926.html
上代码——
- #include <cstdio>
- #include <iostream>
- #include <cmath>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N = ;
- const int M = ;
- int sum[N], fm[N]; //sum[]数组表示任意区间内的数的相对的和。
- int n, m;
- int x, y, val;
- int ans;
- int mfind(int x)
- {
- if(x == fm[x]) return x;
- int fx = fm[x];
- fm[x] = mfind(fm[x]);
- sum[x] += sum[fx]; //及时修改sum[]数组,即,第x个数到当前根节点之间的差值(或者说和)。
- return fm[x];
- }
- void mmerge(int x, int y, int val)
- {
- int fx = mfind(x);
- int fy = mfind(y);
- if(fx == fy)
- {
- if(sum[y]-sum[x] != val) ans++;
- }
- else
- {
- fm[fy] = fx;
- sum[fy] = sum[x]-sum[y]+val; //及时修改sum[]数组,即,两个根节点之间的差值(或者说和)。
- }
- //for(int i = 0; i <= n; i++) printf("%4d", sum[i]);
- //printf("\n");
- }
- void init()
- {
- for(int i = ; i <= n; i++)
- {
- sum[i] = ; //初始化差值
- fm[i] = i;
- }
- ans = ;
- for(int i = ; i < m; i++)
- {
- scanf("%d%d%d", &x, &y, &val);
- mmerge(x-, y, val);
- }
- }
- int main()
- {
- //freopen("test.in", "r", stdin);
- while(~scanf("%d%d", &n, &m))
- {
- init();
- printf("%d\n", ans);
- }
- return ;
- }
hdu 3038 How Many Answers Are Wrong(种类并查集)2009 Multi-University Training Contest 13的更多相关文章
- HDU 3038 How Many Answers Are Wrong(种类并查集)
题目链接 食物链类似的题,主要是在于转化,a-b的和为s,转换为b比a-1大s.然后并查集存 此节点到根的差. 假如x的根为a,y的根为b: b - y = rank[y] a - x = rank[ ...
- hdu 3038 How Many Answers Are Wrong(并查集的思想利用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3038 题意:就是给出n个数和依次m个问题,每个问题都是一个区间的和,然后问你这些问题中有几个有问题,有 ...
- hdu 3038 How Many Answers Are Wrong(并查集)
题意: N和M.有N个数. M个回答:ai, bi, si.代表:sum(ai...bi)=si.如果这个回答和之前的冲突,则这个回答是假的. 问:M个回答中有几个是错误的. 思路: 如果知道sum( ...
- HDU 1829 A Bug's Life (种类并查集)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1829 A Bug's Life Time Limit: 15000/5000 MS (Java/Oth ...
- hdu 1182 A Bug's Life(简单种类并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1829 题意:就是给你m条关系a与b有性关系,问这些关系中是否有同性恋 这是一道简单的种类并查集,而且也 ...
- HDU 5285 wyh2000 and pupil(dfs或种类并查集)
wyh2000 and pupil Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Other ...
- hdu3038 How Many Answers Are Wrong 种类并查集
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int ...
- hdu 3038 How Many Answers Are Wrong ( 带 权 并 查 集 )
How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 3038 How Many Answers Are Wrong (并查集)---并查集看不出来系列-1
Problem Description TT and FF are ... friends. Uh... very very good friends -________-bFF is a bad b ...
随机推荐
- poj 2387 Til the Cows Come Home (最短路,dijkstra模版题)
题目 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include<stdio.h> #include<math ...
- Nodejs常见安装
1.Windows 下成功安装node-canvas2.jsdom——node.js的DOM
- Mysql 1030 Got error -1 from storage engine 错误解决
检查你的my.cnf或my.ini,里面会有一个参数innodb_force_recovery,你看看他的值,默认是没有这个参数,没有的话,他的默认值是0,这个参数的值如果大于0,innodb会被禁止 ...
- oracle触发器详解(转)
触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 8.1 触发器类型 触发器在数据库里以独立的对象存储,它与存储过 ...
- flexbox弹性盒子布局
混合划分 demo1,css: #demo1{ width: 100%; background: #ccc; display: -webkit-flex;/*表示使用弹性布局*/ } #demo1 . ...
- import java.util.Scanner;
一.扫描控制台输入 当通过new Scanner(System.in)创建一个Scanner,控制台会一直等待输入,,,,,,,直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象 ...
- BCB一个问过100遍啊100遍的问题
一个问过100遍啊100遍的问题作者: ---------- ,如转载请保证本文档的完整性,并注明出处.欢迎光临 C++ Builder 研究, http://www.ccrun.com/doc/go ...
- 关于Linux的时间与时区
转:http://linux.chinaunix.net/techdoc/beginner/2007/06/22/960790.shtml 首先要说明的是我的系统是fedora,其他系统可能不完全相同 ...
- *windows下安装以及配置nginx
1.从nginx官网下载相应的安装包. http://nginx.org/
- python流程控制语句 ifelse - 1
考点:条件判断语句if-elif 代码: #! /usr/bin/python print ('\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n') p ...