您的位置:首页 > 其它

1023

2016-06-26 12:19 211 查看
题目编号:1023

题目大意:也一群人在一个体育馆找位置,体育馆座位有300且环绕成一个圈。给出若干两个人的距离,表示B在A的顺时针开始的距离值。求给出的若干关系不正确的个数,也就是后来的座位与前面的有冲突。

解题思路:这个题目是典型的并查集问题,只是对比以前的模版有点区别,这道题的解题关键也就在合并的函数上了。首先输入,然后进入函数,假设是A和B两个人。合并A,B时,假设A,B属于不同的树,那么就要合并这两棵树, 把A树合并到B树上,这时要给A树的跟结点赋值,关键是附上一个什么值呢。由于A点和B点的权值brr[A]和brr[B]都是相对跟结点的距离,所以分析A,B之间的相对距离即可。然后返回bool类型,判断标记加1。最后输出即可。

做题感想:没什么时间做题了,感觉这题还是比较简单的就做了,主要是套用并查集的模版,再进行改装一下。#include<iostream>
#include<cmath>
using namespace std;
int arr[50001],brr[50001],n,m,i,s;
int find(int x)
{
if(x==arr[x])
return arr[x];
int t=arr[x];
arr[x]=find(arr[x]);
brr[x]+=brr[t];
return arr[x];
}

bool YJY(int x,int y, int m){
int a=find(x);
int b=find(y);
if(a==b)
{
if(brr[x]+m!=brr[y])
return false;
return true;
}
arr[b]=a;
brr[b]=brr[x]+m-brr[y];
return true;
}
int main()
{
int a,b,x;
while(cin>>n>>m)
{
for( i=0;i<=n;++i)
{
arr[i]=i;
brr[i]=0;
}
s=0;
for(i=0;i<m;++i)
{
cin>>a>>b>>x;
if(!YJY(a,b,x))
{
++s;
}
}
cout<<s<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: