您的位置:首页 > 其它

HDU-3038-How Many Answers Are Wrong [带权并查集]

2017-07-25 09:44 148 查看
题目传送门

题意:

每输入一行x y s,表示[x,y]的和为s,求有多少行与前面的有冲突。

思路:

可以理解为y比x-1大s,就可以用带权并查集做。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
int N,M;
int fa[200000+100], sum[200000+100];
void init()
{
for (int i = 0; i < 200000; i++)
{
fa[i]=i;
sum[i]=0;
}
return ;
}
int find(int x)
{
if (x==fa[x])return x;
int t = fa[x];
fa[x] = find(fa[x]);
sum[x] += sum[t];
return fa[x];
}
int main(void)
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);

while (~scanf("%d %d", &N, &M))
{
init();
int ans = 0;
while (M--)
{
int x, y, s;
scanf("%d %d %d", &x, &y, &s);
x--;
int a = find(x);
int b = find(y);
if (a==b && sum[x]!=sum[y]+s)
{
ans++;
}
else
{
if (a>b)
{
fa[b] = a;
sum[b] = sum[x]-s-sum[y];
}
else
{
fa[a] = b;
sum[a] = sum[y]+s-sum[x];
}
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: