跟点分治差不多的东西,先转二叉,然后找边,分治。可以动态,还听说有个骚操作叫边分树合并...
注意虚点虚边的处理!注意边分治不能善终,_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 }