分析:
圆方树板子题
每个点维护一下它子树中的颜色。
启发式合并算贡献
不过也可以分颜色用虚树做
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#define SF scanf
#define PF printf
#define MAXN 400010
#define MAXG 1000010
using namespace std;
typedef long long ll;
typedef map<int,int>::iterator mit;
int n,m;
int dfn[MAXN],low[MAXN],cnt;
int st[MAXN],tp;
struct node{
int u,v;
node () {
}
node(int u1,int v1):u(u1),v(v1) {
}
}Edge[MAXN];
int tot,n2;
vector<int> a[MAXN];
void dfs(int x,int fa=0){
dfn[x]=low[x]=++cnt;
st[++tp]=x;
for(int i=0;i<int(a[x].size());i++){
int u=a[x][i];
if(u==fa)
continue;
if(dfn[u]==0){
dfs(u,x);
low[x]=min(low[x],low[u])