hdu 3047 Zjnu Stadium(并查集)
2015-03-17 12:30
399 查看
还是自己划一下图就清楚了。。
当a,b父亲节点不同时,
x,y分别为a,b的父亲节点,a到x,b到y的距离已知,给出a,b间的距离,判断x到y的距离。。
当a,b父亲节点相同时,
直接判断距离是否相等就好了。。 注意是用向量表示的。。
当a,b父亲节点不同时,
x,y分别为a,b的父亲节点,a到x,b到y的距离已知,给出a,b间的距离,判断x到y的距离。。
当a,b父亲节点相同时,
直接判断距离是否相等就好了。。 注意是用向量表示的。。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<iomanip> #include<climits> #include<string.h> #include<cmath> #include<stdlib.h> #include<vector> #include<stack> #include<set> #define INF 1e7 #define MAXN 10010 #define maxn 1000010 #define Mod 1000007 #define N 1010 using namespace std; typedef long long LL; int n, m; int fa[50010]; int dis[50010]; int findset(int x) { if (x == fa[x]) return x; int t = fa[x]; fa[x] = findset(fa[x]); dis[x] += dis[t]; return fa[x]; } bool merg(int a, int b, int w) { int x = findset(a); int y = findset(b); if (x == y) { if (dis[a] + w != dis[b]) return false; return true; } fa[y] = x; dis[y] = dis[a] + w - dis[b]; return true; } int main() { int a, b, w; while (~scanf("%d%d",&n,&m)) { for (int i = 0; i <= n; ++i) fa[i] = i, dis[i] = 0; int ans = 0; for (int i = 0; i < m; ++i) { scanf("%d%d%d", &a, &b, &w); if (!merg(a, b, w)) ans++; } printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU 3047 Zjnu Stadium 带权并查集
- hdu 3047 Zjnu Stadium【带权并查集】
- HDU 3047 Zjnu Stadium(带权并查集)
- HDU - 3047 Zjnu Stadium 带权并查集
- hdu 3047 Zjnu Stadium (带权并查集)
- HDU 3047 Zjnu Stadium 带权并查集
- hdu 3047 Zjnu Stadium(并查集)
- HDU 3047 Zjnu Stadium 带权并查集
- HDU 3047 Zjnu Stadium 带权并查集
- HDU 3047 Zjnu Stadium(带权并查集)
- hdu 3047 Zjnu Stadium 带权并查集
- hdu(3047)——Zjnu Stadium(高级并查集)
- HDU 3047 Zjnu Stadium(带权并查集,路径压缩)
- hdu 3038(How Many Answers Are Wrong)+3047(Zjnu Stadium)(种类并查集)
- HDU 3047 Zjnu Stadium(带权并查集)
- HDU 3047 Zjnu Stadium(带权并查集)
- hdu 3047 Zjnu Stadium(带权并查集)
- HDU 3047 Zjnu Stadium 带权并查集
- HDU 3047 Zjnu Stadium 带权并查集
- HDU 3047 Zjnu Stadium(带权并查集)