1. 程式人生 > >How Many Answers Are Wrong-帶權並查

How Many Answers Are Wrong-帶權並查

  • How Many Answers Are Wrong

  • 經典帶權並查:
  • 對於A~B之間的和是S,其實可以理解成B比A-1大S
  • val記錄這個點到它相應最左的和
  • fa記錄最左端的點
  • 如果兩個點的左端不同則不會發生衝突 只需把根節點相對在右邊的更新val和fa即可
  • 若左端點相同則需要判斷val[v]-val[u]與w是否相等。
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 222200
    int n,m,ans,u,v,w,a,b;
    int fa[maxn],val[maxn];
    int fond(int x)
    {
        if(x==fa[x])
            return x;
        int temp=fond(fa[x]);
        val[x]+=val[fa[x]];
        return fa[x]=temp;
    }
    int main()
    {
        while(cin>>n>>m)
        {
            ans=0;
            for(int i=0; i<=n; i++)
            {
                fa[i]=i;
                val[i]=0;
            }
            while(m--)
            {
                cin>>u>>v>>w;
                u--;
                a=fond(u);
                b=fond(v);
                if(a<b)
                {
                    fa[b]=a;
                    val[b]=val[u]+w-val[v];
                }
                else if(b<a)
                {
                    fa[a]=b;
                    val[a]=val[v]-val[u]-w;
                }
                else
                {
                    if(val[v]-val[u]!=w)
                        ans++;
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }