Problem Description
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.<br>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).<br>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.<br>
Input
There are many test cases:<br>For every case: <br>The first line has two integer N(1<=N<=50,000), M(0<=M<=100,000),separated by a space.<br>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.<br><br>
Output
For every case: <br>Output R, represents the number of incorrect request.<br>
Sample Input
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
Sample Output
2 <div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div> Hint: (PS: the 5th and 10th requests are incorrect) </div>
题意:
有一个体育馆,座位呈环状,想象下,貌似体育馆都是这样的,每一列有300个座位,按逆时钟方向编号为1~300,假设行数无穷大。
某一天,有N个人(编号为1~N)来到这个体育馆看一场赛事,主办方提出了M个要求,要求的格式是"A B X",表示的是,假设A坐在编号为i的列,则B必须坐在编号为(i+x)的列上,这些要求里有一些是错误的,只有和前面的要求产生冲突时才算错误,其它都是正确的。程序要输出错误的要求个数。
思路:并查集
代码:
#include<stdio.h>
int set[50005];
int dist[50005];
int count;
/*find方法错误,待改正
int find(int x)
{
int r=x;
while(r!=set[r])
{r=set[r];
dist[r]+=dist[set[r]];
}
return r;
}*/
int find(int a)
{
if(set[a]==a)return a;
int tem = set[a];
set[a]=find( set[a]);
dist[a] += dist[tem];
return set[a];
}
void merge(int x,int y,int s)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
set[fy]=fx;
dist[fy]=dist[x]+s-dist[y];
}
else
{
if(dist[y]-dist[x]!=s)
count++;
}
}
int main()
{
int n,m,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
count=0;
for(int i=1;i<=n;i++)
{
set[i]=i;
dist[i]=0;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
merge(a,b,c);
}
printf("%d\n",count);
}
return 0;
}
int set[50005];
int dist[50005];
int count;
/*find方法错误,待改正
int find(int x)
{
int r=x;
while(r!=set[r])
{r=set[r];
dist[r]+=dist[set[r]];
}
return r;
}*/
int find(int a)
{
if(set[a]==a)return a;
int tem = set[a];
set[a]=find( set[a]);
dist[a] += dist[tem];
return set[a];
}
void merge(int x,int y,int s)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
{
set[fy]=fx;
dist[fy]=dist[x]+s-dist[y];
}
else
{
if(dist[y]-dist[x]!=s)
count++;
}
}
int main()
{
int n,m,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
count=0;
for(int i=1;i<=n;i++)
{
set[i]=i;
dist[i]=0;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
merge(a,b,c);
}
printf("%d\n",count);
}
return 0;
}