一共有三种状态:
1、d[u][0]:u是服务器,每个子结点可以是也可以不是。
2、d[u][1]:u不是服务器,但u的父亲是,u的子结点都不是服务器。
3、d[u][2]:u和u的父亲都不是服务器,u的子结点恰有一个是服务器。
三种状态的转移:
d[u][0]=∑min(d[v][0],d[v][1])+1d[u][1]=∑d[v][2]d[u][2]=min(d[u][1]−d[v][2]+d[v][0])
1 #include2 using namespace std; 3 4 const int maxn = 1e4+5; 5 const int INF = 1e9; 6 7 vector G[maxn],vertices; 8 int p[maxn],d[maxn][3]; 9 10 void dfs(int u,int fa){11 vertices.push_back(u);12 p[u] = fa;13 for(int i=0; i =0; i--){33 int u = vertices[i];34 d[u][0] = 1; d[u][1] = 0;35 for(int i=0; i INF) d[u][0] = INF;41 if(d[u][1]>INF) d[u][1] = INF;42 }43 44 d[u][2] = INF;45 for(int i=0; i