您的位置:首页 > 其它

HDU 3047 Zjnu Stadium(带权并查集)

2017-11-23 16:54 369 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3047

题意:

给出n个座位,有m次询问,每次a,b,d表示b要在a右边d个位置处,问有几个询问是错误的。

思路:

基础带权并查集。

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 50000+5;

int n,m;
int p[maxn],r[maxn];

int finds(int x)
{
if(p[x]==x)  return x;
int tmp = p[x];
p[x] = finds(p[x]);
r[x] = r[x] + r[tmp];
return p[x];
}

void unions(int a, int b, int x, int y, int d)
{
p[x] = y;
r[x] = d+r[b]-r[a];
}

int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
int ans = 0;
for(int i=0;i<=n;i++)   {p[i] = i;r[i] = 0;}
while(m--)
{
int a,b,d;
scanf("%d%d%d",&a,&b,&d);
int x = finds(a);
int y = finds(b);
if(x==y)
{
if(r[a]-r[b]!=d)  ans++;
}
else
{
unions(a,b,x,y,d);
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: