课程练习四-problemW

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;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值