跟点分治差不多的东西,先转二叉,然后找边,分治。可以动态,还听说有个骚操作叫边分树合并...

注意虚点虚边的处理!注意边分治不能善终,_n = 1的时候特判。

 1 void rebuild(int x, int f) {
 2     int temp = 0;
 3     for(int i = 0; i < (int)G[x].size(); i++) {
 4         int y = G[x][i];
 5         if(y == f) continue;
 6         if(!temp) {
 7             temp = x;
 8             add(x, y, 1);
 9             add(y, x, 1);
10         }
11         else if(i == G[x].size() - 1) {
12             add(temp, y, 1);
13             add(y, temp, 1);
14         }
15         else {
16             add(temp, ++cnt, 0);
17             add(cnt, temp, 0);
18             val[cnt] = val[temp];
19             temp = cnt;
20             add(temp, y, 1);
21             add(y, temp, 1);
22         }
23         rebuild(y, x);
24     }
25     return;
26 }
转二叉

相关文章: