zoukankan      html  css  js  c++  java
  • hdu3047 Zjnu Stadium

    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.
    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.
     

    Input
    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.

     

    Output
    For every case: 
    Output R, represents the number of incorrect request.
     

    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
    Hint
    Hint:

    (PS: the 5th and 10th requests are incorrect)

    这题可以用并查集做,属于带权值的并查集。t1,t2是根节点,其中root[t2]=root[a]+c-root[b];(可以用向量推)t2是集合二的根节点,a,b是输入的点

    这里抄附上一张图

    root[a]

    a--------ra

    | -

    |x -

    | root[b] -

    b--------------------rb

    原本以为rb经过集合合并后根节点是a,但其实是ra,所以可以递归并查集算出每个节点离根节点的距离

    #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<map> #include<string> using namespace std; int pre[50005],root[50005]; int find(int x) { int temp; if(x==pre[x])return x; temp=pre[x]; pre[x]=find(pre[x]); root[x]=root[x]+root[temp]; return pre[x]; } int main() { int n,m,i,j,a,b,c,t1,t2,ans; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<=n;i++){ pre[i]=i;root[i]=0; } ans=0; for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); t1=find(a);t2=find(b); if(t1==t2){ if(root[b]-root[a]!=c){ ans++;continue; } } else{ pre[t2]=t1; root[t2]=root[a]+c-root[b]; } } printf("%d ",ans); } return 0; }

  • 相关阅读:
    回溯算法
    再谈排序与图论算法
    Hash表
    B树和TreeSet与TreeMap
    回顾二叉树
    Spring实战第一部分总结
    Lucene6.6添加索引数据时字符个数超限,字符数不能超过BYTE_BLOCK_SIZE=32766
    第一章 机器学习基本概念
    第十至十二章 算法分析--高阶数据结构
    Lucene4.6至 Lucene6.6的每个迭代对API的改动
  • 原文地址:https://www.cnblogs.com/herumw/p/9464804.html
Copyright © 2011-2022 走看看