第六周 2.21-2.27

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六周 2.21-2.27相关的知识,希望对你有一定的参考价值。

只有一周了QAQ

2.21

CF 629 E Famil Door and Roads

其实Tarjan的时候搞一搞,就O(n+m)了吖。

技术分享
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <vector>
  4 using namespace std;
  5 typedef long long LL;
  6 typedef pair<int, int> pii;
  7 const int maxn = 1e5 + 10;
  8 vector<pii> q[maxn];
  9 double ans[maxn];
 10 
 11 //Tree
 12 int cnt, h[maxn];
 13 struct edge
 14 {
 15     int to, pre;
 16 } e[maxn<<1];
 17 
 18 void add(int from, int to)
 19 {
 20     cnt++;
 21     e[cnt].pre = h[from];
 22     e[cnt].to = to;
 23     h[from] = cnt;
 24 }
 25 
 26 //TreeDP
 27 LL dis[maxn], fdis[maxn];
 28 int sz[maxn], fsz[maxn], dep[maxn];
 29 void dfs1(int p, int d)
 30 {
 31     sz[p] = 1, dep[p] = d;
 32     for(int i = h[p]; i; i = e[i].pre)
 33     {
 34         int to = e[i].to;
 35         if(dep[to]) continue;
 36         dfs1(to, d + 1);
 37         sz[p] += sz[to];
 38         dis[p] += dis[to] + sz[to];
 39     }
 40 }
 41 
 42 //Tarjan
 43 int fa[maxn], vis[maxn], cur[maxn];
 44 int Find(int x)
 45 {
 46     return fa[x] == x ? x : fa[x] = Find(fa[x]);
 47 }
 48 
 49 void dfs2(int p, int f)
 50 {
 51     fa[p] = p, vis[p] = 2;
 52     if(p != 1)
 53     {
 54         fsz[p] = fsz[f] + sz[f] - sz[p];
 55         fdis[p] = fdis[f] + dis[f] - dis[p] - sz[p] + fsz[p];
 56     }
 57     for(int i = h[p]; i; i = e[i].pre)
 58     {
 59         int to = e[i].to;
 60         if(to == f) continue;
 61         cur[p] = to;
 62         dfs2(to, p);
 63         fa[to] = p;
 64     }
 65     vis[p] = 1;
 66     int qsz = q[p].size();
 67     for(int i = 0; i < qsz; i++)
 68     {
 69         int to = q[p][i].first, id = q[p][i].second;
 70         if(!vis[to]) continue;
 71         int anc = Find(to);
 72         if(anc == to)
 73         {
 74             LL d = dep[p] - dep[to] + 1;
 75             ans[id] = (1.0 * dis[p] * fsz[cur[to]] + 1.0 * (fdis[cur[to]] - (LL)fsz[cur[to]]) * sz[p]) / sz[p] / fsz[cur[to]] + d;
 76         }
 77         else if(vis[p] == 1 && anc != p)
 78         {
 79             LL d = dep[p] + dep[to] - dep[anc] - dep[anc] + 1;
 80             ans[id] = (1.0 * dis[p] * sz[to] + 1.0 * dis[to] * sz[p]) / sz[p] / sz[to] + d;
 81         }
 82     }
 83     return;
 84 }
 85 
 86 int main(void)
 87 {
 88     int n, m;
 89     scanf("%d %d", &n, &m);
 90     for(int i = 1; i < n; i++)
 91     {
 92         int u, v;
 93         scanf("%d %d", &u, &v);
 94         add(u, v), add(v, u);
 95     }
 96     for(int i = 0; i < m; i++)
 97     {
 98         int u, v;
 99         scanf("%d %d", &u, &v);
100         q[u].push_back(pii(v, i));
101         q[v].push_back(pii(u, i));
102     }
103     dfs1(1, 1);
104     dfs2(1, 0);
105     for(int i = 0; i < m; i++) printf("%.9f\n", ans[i]);
106     return 0;
107 }
Aguin

 

以上是关于第六周 2.21-2.27的主要内容,如果未能解决你的问题,请参考以下文章

学习进度条(第六周)

第六周

第六周的多线程代码测试题补交的博客

第六周总结表

20165331 第六周学习总结

第六周学习进度