UVA1218PerfectService

xiaoxiao2021-02-28  53

//UVA1218PerfectService #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int MAXN = 1e4 + 10; const int INF = 1e9; vector<int> G[MAXN], vertices; int d[MAXN][3], p[MAXN]; void dfs(int now, int father) { p[now] = father; vertices.push_back(now); for(int i = 0; i < G[now].size(); i++) { int v = G[now][i]; if(father == v) continue; dfs(v, now); } }//定好dp遍历时的顺序 int main() { int N; while(scanf("%d", &N) == 1 && N != -1) { int a, b; vertices.clear(); for(int i = 0; i <= N; i++) G[i].clear(); for(int i = 0; i < N - 1; i++) { scanf("%d%d", &a, &b); a--; b--; G[a].push_back(b); G[b].push_back(a); }//建图 dfs(0, -1);//建立之后动态规划的遍历顺序 for(int k = vertices.size() - 1; k >= 0; k--) { int u = vertices[k]; // d[u][0] = 1; d[u][1] = 0; //若k是服务器,则将d[k]初始化为1,否则初始化为0 for(int i = 0; i < G[u].size(); i++) { //printf("u = %d\n", vertices[k]); int v = G[u][i]; if(v == p[u]) continue; //遇到父节点则跳过 d[u][0] += min(d[v][0], d[v][1]); //printf("d[u][0] = %d, d[u][1] = %d\n", d[u][0], d[u][1]); d[u][1] += d[v][2]; if(d[u][0] > INF) d[u][0] = INF; if(d[u][1] > INF) d[u][1] = INF; } d[u][2] = INF; for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(v == p[u]) continue; d[u][2] = min(d[u][1] - d[v][2] + d[v][0], d[u][2]); //printf("d[u][2] = %d\n", d[u][2]); } } printf("%d\n", min(d[0][0], d[0][2])); int flag; scanf("%d", &flag); if(flag == -1) break; } return 0; } /* 6 1 3 2 3 3 4 4 5 4 6 0 2 1 2 -1 */
转载请注明原文地址: https://www.6miu.com/read-62371.html

最新回复(0)