Advertisement
Ctyderv

EDGY TREES

Mar 23rd, 2019
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <numeric>
  3. #include <vector>
  4.  
  5. using namespace std;
  6. typedef long long int ull;
  7. const int mod=1e9+7;
  8.  
  9. ull ABS(ull n){
  10.     if(n<0)return n+mod;
  11.         else return n;
  12. }
  13.  
  14. class disjoint{
  15.     int *par, *rnk;
  16. public:
  17.     disjoint(int);
  18.     void niteu(int, int);
  19.     int indf(int);
  20. };
  21.  
  22. disjoint::disjoint(int n){
  23.     par=new int[n]; rnk=new int[n];
  24.     for(int i=0; i<n; i++)
  25.         par[i]=i, rnk[i]=1;
  26. }
  27.  
  28. int disjoint::indf(int x){
  29.     if(x==par[x])return x;
  30.         else return par[x]=indf(par[x]);
  31. }
  32.  
  33. void disjoint::niteu(int x, int y){
  34.     if(x!=y){
  35.         if(rnk[x]<rnk[y])
  36.             x=((x+y)-(y=x));
  37.  
  38.         par[y]=x;
  39.         if(rnk[x]==rnk[y])
  40.             rnk[x]++;
  41.     }
  42. }
  43.  
  44. ull pow(ull n, int k){
  45.     ull a=1;
  46.     while(k){
  47.         if(k&1)
  48.             a=(a*n)%mod;
  49.         n=(n*n)%mod;
  50.         k>>=1;
  51.     }
  52.     return a;
  53. }
  54.  
  55. vector<int> read(int &N, int &k){
  56.     int a, b, c;
  57.     cin>>N>>k;
  58.  
  59.     disjoint dis(N);
  60.     vector<int>v(N,0);
  61.     for(int i=1; i<N; i++){
  62.         cin>>a>>b>>c;
  63.         a--, b--;
  64.         if(!c){
  65.             int x=dis.indf(a),
  66.                 y=dis.indf(b);
  67.             dis.niteu(x,y);
  68.         }
  69.     }
  70.     for(int i=0; i<N; i++)
  71.         v[dis.indf(i)]++;
  72.     return v;
  73. }
  74.  
  75. int n, k;
  76. int main(){
  77.     vector<int>v=read(n,k);
  78.     cout<<ABS(ull(pow(n,k))-accumulate(v.begin(),v.end(),ull(0),
  79.                      [](int x, int y){
  80.                         return ((x+pow(y,k))%mod);}));
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement