Cod sursa(job #1678875)

Utilizator RadduFMI Dinu Radu Raddu Data 7 aprilie 2016 16:03:28
Problema BMatrix Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <map>
#define hashn 137
#define mod 1000000007
#define ll long long
using namespace std;
ifstream f("avd.in");
ofstream g("avd.out");
vector <int> v[15],c[15];
map <int ,int> h;
int n,m,k,s[15],nrn,dp[15],use[15],ok[15],pw[15];

void DFS(int x)
{int i;
  use[x]=1; nrn++;

  for(i=0;i<v[x].size();i++)
   if (!use[v[x][i]] && ok[c[x][i]]) DFS(v[x][i]);
}
int main()
{ int i,j,x,y,t,act,conf=0;
 f>>t;
 for(;t;t--)
 {
   f>>n; m=n-1;

  memset(dp,0,sizeof(dp));
  for(i=1;i<=n;i++)
   {v[i].clear();
    c[i].clear();
   }
   h.clear();

   dp[0]=1; conf=0;
   for(i=1;i<=n;i++)
    for(j=0;j<=n-i;j++)
     dp[i+j]+=dp[j];

   for(i=1;i<n;i++)
   { f>>x>>y;
     v[x].push_back(y);
     v[y].push_back(x);
     c[x].push_back(i);
     c[y].push_back(i);
   }
    pw[1]=hashn;

   for(i=2;i<=15;i++)
    pw[i]=1LL*pw[i-1]*hashn%mod;

   for(i=0;i<(1<<m);i++)
   {

     for(j=1;j<=m;j++)
     if (i&(1<<(j-1))) ok[j]=1; else ok[j]=0;

     memset(use,0,sizeof(use));

     k=0;
     for(j=1;j<=n;j++)
      if (!use[j]) {nrn=0; DFS(j); k++; s[k]=nrn;}

     sort(s+1,s+k+1);

    act=0;
    for(j=1;j<=k;j++)
     act=((ll)act+s[j]*pw[j])%mod;


    if (!h[act]) {h[act]++; conf++;}


   }

   g<<fixed<<setprecision(5)<<(double)conf/dp[n]<<"\n";

 }
    return 0;
}