题目大意:
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>
#include<cstdio> #include<cmath> using namespace std; #define N 50005 int f[N], rank[N], n, m; void init(){ for(int i=0; i<=n; ++i) f[i]=i, rank[i]=0; } int find(int x){ if(x==f[x]) return f[x]; int t=f[x]; f[x] = find(f[x]); rank[x] += rank[t]; return f[x]; } bool Union(int x,int y, int m){ int a=find(x), b=find(y); if(a==b){ if(rank[x]+m!=rank[y]) return false; return true; } f[b] = a; rank[b] = rank[x]+m-rank[y]; return true; } int main(){ int a,b,x; while(~scanf("%d%d",&n,&m)){ init(); int cnt=0; for(int i=0; i<m; ++i){ scanf("%d%d%d",&a,&b,&x); if(!Union(a, b, x)){ ++cnt; } } printf("%d\n",cnt); } return 0; }