您的位置:首页 > 其它

hdu 3047(扩展并查集)

2016-05-10 20:05 183 查看

Zjnu Stadium

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2672 Accepted Submission(s): 1028


[align=left]Problem Description[/align]
In
12th Zhejiang College Students Games 2007, there was a new stadium
built in Zhejiang Normal University. It was a modern stadium which
could hold thousands of people. The audience Seats made a circle. The
total number of columns were 300 numbered 1--300, counted clockwise, we
assume the number of rows were infinite.
These days, Busoniya want
to hold a large-scale theatrical performance in this stadium. There will
be N people go there numbered 1--N. Busoniya has Reserved several
seats. To make it funny, he makes M requests for these seats: A B X,
which means people numbered B must seat clockwise X distance from
people numbered A. For example: A is in column 4th and X is 2, then B
must in column 6th (6=4+2).
Now your task is to judge weather the
request is correct or not. The rule of your judgement is easy: when a
new request has conflicts against the foregoing ones then we define it
as incorrect, otherwise it is correct. Please find out all the
incorrect requests and count them as R.

[align=left]Input[/align]
There are many test cases:
For every case:
The first line has two integer N(1<=N<=50,000), M(0<=M<=100,000),separated by a space.
Then M lines follow, each line has 3 integer A(1<=A<=N), B(1<=B<=N), X(0<=X<300) (A!=B), separated by a space.

[align=left]Output[/align]
For every case:
Output R, represents the number of incorrect request.

[align=left]Sample Input[/align]

10 10
1 2 150
3 4 200
1 5 270
2 6 200
6 5 80
4 7 150
8 9 100
4 8 50
1 7 100
9 2 100

[align=left]Sample Output[/align]
2

题意:就是一个无限大的场地里面坐了很多人,每两个人之间都有一个距离。如果后面的描述和前面的冲突,那么则认为这条是错误的。问总共有多少条错误的描述。
题解:向量偏移的并查集。详细了解可以参考我的博客:http://www.cnblogs.com/liyinggang/p/5327055.html
我们设某个点到根节点的距离a->root为sum[a],然后套用公式就OK
当描述的两个人已经位于同一棵子树了
a->b = a->root - b->root
还没有位于同一棵子树时
roota ->rootb = b->rootb + a->b - a->roota
方向千万不要搞错。

#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N =50001;
int father
;
int sum
;  ///记录当前结点到根结点的距离

int _find(int x){
if(x!=father[x]){
int t = father[x];
father[x] = _find(father[x]);
sum[x]+=sum[t];
}
return father[x];
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<=n;i++){
father[i] = i;
sum[i] = 0;
}
int ans = 0;
while(m--){
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
int roota = _find(a);
int rootb = _find(b);
if(roota==rootb){
if(sum[a]-sum[b]!=v) ans++;
}
else{
father[roota] = rootb;
sum[roota] = -sum[a]+sum[b]+v;
}
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: