HDU 3038 How Many Answers Are Wrong (并查集好题)(带权并查集)
2016-07-20 15:30
435 查看
这道题给了你很多带值的区间,a到b的和为c,问你有几条是假的。
在并查集的基础上附加上值,这样在路径压缩的时候也要更新节点到father的和。
对于计算dis还有一些疑惑,想了半天,还是先做下一题吧~
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1e5+5;
int father[maxn],dis[maxn],n,m,ans;
int query(int x) {
if(x != father[x]) {
int per = father[x];
father[x] = query(father[x]);
dis[x] += dis[per]; // 路径压缩的时候吧 x到father[x]的距离也加起来
}
return father[x];
}
void merge(int x,int y,int z) {
int a = query(x);
int b = query(y);
if(a < b) {
father[b] = a;
dis[b] = dis[x] - dis[y] + z; /这里还是有些不理解
}
else if(a > b) {
father[a] = b;
dis[a] = -(dis[x] - dis[y] + z);
}
else {
if(dis[y] - dis[x] != z)
ans++;
}
}
int main() {
while(scanf("%d%d",&n,&m) != EOF) {
ans = 0;
for(int i = 0;i <= n;i++) {
father[i] = i;
dis[i] = 0;
}
for(int i = 1;i <= m;i++) {
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
x--;
merge(x,y,z);
}
printf("%d\n",ans);
}
}
在并查集的基础上附加上值,这样在路径压缩的时候也要更新节点到father的和。
对于计算dis还有一些疑惑,想了半天,还是先做下一题吧~
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1e5+5;
int father[maxn],dis[maxn],n,m,ans;
int query(int x) {
if(x != father[x]) {
int per = father[x];
father[x] = query(father[x]);
dis[x] += dis[per]; // 路径压缩的时候吧 x到father[x]的距离也加起来
}
return father[x];
}
void merge(int x,int y,int z) {
int a = query(x);
int b = query(y);
if(a < b) {
father[b] = a;
dis[b] = dis[x] - dis[y] + z; /这里还是有些不理解
}
else if(a > b) {
father[a] = b;
dis[a] = -(dis[x] - dis[y] + z);
}
else {
if(dis[y] - dis[x] != z)
ans++;
}
}
int main() {
while(scanf("%d%d",&n,&m) != EOF) {
ans = 0;
for(int i = 0;i <= n;i++) {
father[i] = i;
dis[i] = 0;
}
for(int i = 1;i <= m;i++) {
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
x--;
merge(x,y,z);
}
printf("%d\n",ans);
}
}
相关文章推荐
- 1611:The Suspects
- 作业四,1001
- 作业四1002
- 作业四1003
- 练习四1005
- 最小权值和
- HDU-1213-How Many Tables
- Longest Consecutive Sequence,Distinct Subsequences,Interleaving String,Scramble String
- 并查集_POJ 1182_食物链
- SARS病毒传染 并查集
- HDU 1213
- CSU1307 并查集+SPFA
- 并查集
- BestWiring——Kruskal算法&并查集
- 1611:The Suspects
- 并查集示例1
- 并查集(union-find)学习报告
- poj3728
- HDU-1233 还是畅通工程(最小生成树&并查集)
- Simon-【深入理解数据结构】有根树的不同实现① —— 并查集