您的位置:首页 > 其它

HDU - 3038(并查集)How Many Answers Are Wrong

2017-04-20 20:48 375 查看
这是一个带权的并查集,给你区间和的信息,然后让你判断哪些信息是错的,先将没确定的(没在一个集合的)区间加到一个集合里,如果这两个区间在一个集合,即被确定了,然后跟题上给的信息进行对比如果不一样就说明这条信息是错误的ans就++。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <iostream>
#define PI 3.1415926535898
#define LL long long
#define MAX 0x3fffffff
#define INF 0x3f3f3f3f
#define mem(a,v) memset(a,v,sizeof(a))
const int MAX_N = 2e5+10;
const double eps = 1e-7;
const LL mod = 1000000007;
const LL inf = 1LL<<60;
using namespace std;
int fa[MAX_N],val[MAX_N];
int Find(int x)
{
if(x == fa[x])
return fa[x];
int fx = fa[x];
fa[x] = Find(fa[x]);
val[x]+=val[fx];
return fa[x];
}
int main()
{
int N,M;
while(scanf("%d%d",&N,&M)!=EOF)
{
memset(val,0,sizeof(val));
for(int i = 0;i <= N;i++)
fa[i] = i;
int ans = 0;
int u,v,w;
for(int i = 0;i < M;i++)
{
scanf("%d%d%d",&u,&v,&w);
u--;
int fx = Find(u);
int fy = Find(v);
if(fx!=fy)
{
fa[fy] = fx;
val[fy] = w+val[u]-val[v];
//cout<<val[fy]<<endl;
}
else if(val[v]-val[u]!=w)
ans++;
}
cout<<ans<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: