Advertisement
Guest User

Untitled

a guest
Sep 29th, 2014
605
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <vector>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <cassert>
  8. using namespace std;
  9.  
  10. typedef long double ld;
  11.  
  12. const int Maxn = 16;
  13. const int Maxm = 200;
  14. const ld eps = 1e-11l;
  15.  
  16. int t;
  17. int n, m;
  18. vector <int> neigh[Maxn];
  19. int a, b;
  20. int id[Maxn][Maxn];
  21. int curcomp, comp[Maxn];
  22. ld matr[Maxm][Maxm];
  23. ld res[Maxm];
  24.  
  25. void getComp(int v, int col)
  26. {
  27.     if (comp[v]) return;
  28.     comp[v] = col;
  29.     for (int i = 0; i < neigh[v].size(); i++) {
  30.         int u = neigh[v][i];
  31.         getComp(u, col);
  32.     }
  33. }
  34.  
  35. int ID(int a, int b) { return id[min(a, b)][max(a, b)]; }
  36.  
  37. int main()
  38. {
  39.     scanf("%d", &t);
  40.     for (int tc = 1; tc <= t; tc++) {
  41.         scanf("%d %d", &n, &m);
  42.         for (int i = 1; i <= n; i++) {
  43.             neigh[i].clear();
  44.             neigh[i].push_back(i);
  45.             comp[i] = 0;
  46.         }
  47.         for (int i = 1; i <= m; i++) {
  48.             int a, b; scanf("%d %d", &a, &b);
  49.             neigh[a].push_back(b);
  50.             neigh[b].push_back(a);
  51.         }
  52.         scanf("%d %d", &a, &b);
  53.         curcomp = 0;
  54.         for (int i = 1; i <= n; i++)
  55.             if (comp[i] == 0) getComp(i, ++curcomp);
  56.         printf("Case #%d: ", tc);
  57.         if (comp[a] != comp[b])
  58.             for (int i = 1; i <= n; i++)
  59.                 printf("N/A%c", i + 1 <= n? ' ': '\n');
  60.         else {
  61.             int cur = 0;
  62.             for (int i = 1; i <= n; i++) if (comp[i] == comp[a])
  63.                 for (int j = i; j <= n; j++) if (comp[j] == comp[a])
  64.                     id[i][j] = cur++;
  65.             for (int s = 1; s <= n; s++) {
  66.                 if (comp[s] != comp[a]) printf("N/A");
  67.                 else {
  68.                     for (int i = 1; i <= n; i++) if (comp[i] == comp[a])
  69.                         for (int j = i; j <= n; j++) if (comp[j] == comp[a]) {
  70.                             for (int k = 0; k <= cur; k++)
  71.                                 matr[id[i][j]][k] = 0;
  72.                             matr[id[i][j]][id[i][j]] = 1;
  73.                             if (i != s || j != s) {
  74.                                 matr[id[i][j]][cur] = 1;
  75.                                 ld hm = 1.0l / (ld(neigh[i].size()) * ld(neigh[j].size()));
  76.                                 for (int c = 0; c < neigh[i].size(); c++) {
  77.                                     int ni = neigh[i][c];
  78.                                     for (int d = 0; d < neigh[j].size(); d++) {
  79.                                         int nj = neigh[j][d];
  80.                                         matr[id[i][j]][ID(ni, nj)] -= hm;
  81.                                     }
  82.                                 }
  83.                             }
  84.                         }
  85.                     for (int j = 0; j < cur; j++) {
  86.                         int i = j;
  87.                         while (i < cur && fabs(matr[i][j]) < eps) i++;
  88.                         assert(i < cur);
  89.                         if (i != j)
  90.                             for (int k = 0; k <= cur; k++)
  91.                                 swap(matr[i][k], matr[j][k]);
  92.                         i = j;
  93.                         for (int i2 = i + 1; i2 < cur; i2++)
  94.                             if (fabs(matr[i2][j]) >= eps) {
  95.                                 ld mult = -matr[i2][j] / matr[i][j];
  96.                                 for (int k = 0; k <= cur; k++)
  97.                                     matr[i2][k] += mult * matr[i][k];
  98.                             }
  99.                     }
  100.                     for (int i = cur - 1; i >= 0; i--) {
  101.                         ld val = matr[i][cur];
  102.                         for (int j = i + 1; j < cur; j++)
  103.                             val -= matr[i][j] * res[j];
  104.                         res[i] = val / matr[i][i];
  105.                         if (i == ID(a, b)) {
  106.                             cout << fixed << setprecision(12) << res[i];
  107.                             break;
  108.                         }
  109.                     }
  110.                 }
  111.                 printf("%c", s + 1 <= n? ' ': '\n');
  112.             }
  113.         }
  114.     }
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement