Advertisement
Guest User

ee

a guest
Dec 26th, 2015
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.45 KB | None | 0 0
  1. import java.util.ArrayList;
  2.  
  3. public class DiameterOfRandomTree {
  4.  
  5.     int n;
  6.     ArrayList<Integer>[] e;
  7.     double[][][] prob;
  8.     boolean[][][] done;
  9.  
  10.  
  11.     double calc(int cur, int from, int mustLeq)
  12.     {
  13.         if(mustLeq < 0) return 0;
  14.         if(done[cur][from][mustLeq]) return prob[cur][from][mustLeq];
  15.         double p = 1.0;
  16.         for(int i = 0; i < e[cur].size(); i++)
  17.         {
  18.             int t = e[cur].get(i);
  19.             if(t == from) continue;
  20.             double curProb = 0;
  21.             curProb += 0.5 * calc(t, cur, mustLeq - 1);
  22.             curProb += 0.5 * calc(t, cur, mustLeq - 2);
  23.             p *= curProb;
  24.         }
  25.         done[cur][from][mustLeq] = true;
  26.         prob[cur][from][mustLeq] = p;
  27.         return p;
  28.     }
  29.  
  30.     double exact(int cur, int from, int l)
  31.     {
  32.         return calc(cur, from, l) - calc(cur, from, l-1);
  33.     }
  34.  
  35.     public double getExpectation(int[] a, int[] b)
  36.     {
  37.         n = a.length + 1;
  38.         prob = new double[n][n][n+1];
  39.         done = new boolean[n][n][n+1];
  40.         e = new ArrayList[n];
  41.         for(int i = 0; i < n; i++)
  42.             e[i] = new ArrayList<Integer>();
  43.         for(int i = 0; i < a.length; i++)
  44.         {
  45.             e[a[i]].add(b[i]);
  46.             e[b[i]].add(a[i]);
  47.         }
  48.         double ans = 0;
  49.         // center is at middle of edge
  50.         for(int i = 0; i < a.length; i++)
  51.             for(int x = 0; x < n; x ++)
  52.             {
  53.                 ans += exact(a[i], b[i], x) * exact(b[i], a[i], x) * (2 * x + 1.5);
  54.                 ans += exact(a[i], b[i], x) * exact(b[i], a[i], x-1) * (2 * x + 1) * 0.5;
  55.                 ans += exact(a[i], b[i], x-1) * exact(b[i], a[i], x) * (2 * x + 1) * 0.5;
  56.             }
  57.  
  58.         // center is at vertex
  59.         for(int i = 0; i < n; i++)
  60.             for(int x = 0; x < n; x++)
  61.             {
  62.                 double p1 = 1.0;
  63.                 for(int j = 0; j < e[i].size(); j++)
  64.                 {
  65.                     double curP = 0;
  66.                     curP += 0.5 * calc(e[i].get(j), i, x - 1);
  67.                     curP += 0.5 * calc(e[i].get(j), i, x - 2);
  68.                     p1 *= curP;
  69.                 }
  70.                 double p2 = 1.0;
  71.                 for(int j = 0; j < e[i].size(); j++)
  72.                 {
  73.                     double curP = 0;
  74.                     curP += 0.5 * calc(e[i].get(j), i, x - 2);
  75.                     curP += 0.5 * calc(e[i].get(j), i, x - 3);
  76.                     p2 *= curP;
  77.                 }
  78.                 p1 -= p2;
  79.                 for(int s = 0; s < e[i].size(); s++)
  80.                 {
  81.                     double p3 = 1.0;
  82.                     for(int j = 0; j < e[i].size(); j++)
  83.                     {
  84.                         if(j != s)
  85.                         {
  86.                             double curP = 0;
  87.                             curP += 0.5 * calc(e[i].get(j), i, x - 2);
  88.                             curP += 0.5 * calc(e[i].get(j), i, x - 3);
  89.                             p3 *= curP;
  90.                         }
  91.                         else
  92.                         {
  93.                             double curP = 0;
  94.                             curP += 0.5 * exact(e[i].get(j), i, x - 1);
  95.                             curP += 0.5 * exact(e[i].get(j), i, x - 2);
  96.                             p3 *= curP;
  97.                         }
  98.                     }
  99.                     p1 -= p3;
  100.                 }
  101.                 ans += p1 * x * 2;
  102.             }
  103.         return ans;
  104.     }
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement