CodeForces 734E - Anton and Tree
2016-12-01 21:29
393 查看
题目大意:对于给定的一颗树,现在已知这棵树的节点只有0,1两种颜色,你可以任选一个节点,并将这个节点所在的颜色相通的联通块颜色全部反转。问,最少需要几次操作可以将这棵树上所有的节点变成用一种颜色。
思路: 每次将一个联通块的颜色反转,比较容易想到每次反转后当前这个联通块的区域都会变的更大。
所以我们首先将这棵树进行缩点。缩点之后的树,每个节点都是原来的一个联通快。而将联通块的颜色反转等价于将这个缩点之后的树上的某个节点的全部相连的节点合并到当前节点。这样我们可以发现,我们每次在树上最长的链上做缩点操作能保证次数最少,最少的次数为length/2。
思路: 每次将一个联通块的颜色反转,比较容易想到每次反转后当前这个联通块的区域都会变的更大。
所以我们首先将这棵树进行缩点。缩点之后的树,每个节点都是原来的一个联通快。而将联通块的颜色反转等价于将这个缩点之后的树上的某个节点的全部相连的节点合并到当前节点。这样我们可以发现,我们每次在树上最长的链上做缩点操作能保证次数最少,最少的次数为length/2。
#include <cstdio> #include <string> #include<iostream> #include<vector> #include <stack> #include <queue> #include <map> #include <cstdlib> #include<string.h> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; typedef pair<int, int>pii; typedef pair<ll, ll> pll; typedef pair<int, ll> pil; const int MAXN = 300000 + 10; bool vis[MAXN]; int cot[MAXN]; int col[MAXN]; vector<int>g[MAXN]; vector<int>gg[MAXN]; int tot = 0; int deep = 0,pos=0; void dfs1(int x,int fa) { if (vis[x])return; vis[x] = true; if (col[x] != col[fa])gg[x].push_back(fa), gg[fa].push_back(x),fa=x; for (int i = 0; i < g[x].size(); i++)dfs1(g[x][i], fa); } void dfs2(int x, int dp) { if (vis[x])return; vis[x] = true; if (dp>deep)deep = dp, pos = x; for (int i = 0; i < gg[x].size(); i++)dfs2(gg[x][i], dp + 1); } int main() { memset(col, -1, sizeof col); memset(cot, 0, sizeof cot); memset(vis, false, sizeof vis); deep = 0; pos = 0; tot = 0; int n; scanf("%d", &n); for (int i = 1; i <= n; i++)scanf("%d", col + i); for (int i = 0; i < n - 1; i++) { int x, y; scanf("%d%d", &x, &y); g[x].push_back(y); g[y].push_back(x); } dfs1(1, 1); memset(vis, false, sizeof vis); dfs2(1, 0); //deep = 0; memset(vis, false, sizeof vis); dfs2(pos, 0); printf("%d\n", (deep+1)/2); //system("pause"); }
相关文章推荐
- codeforces - 734E - Anton and Tree(图论 树)
- 【codeforces 734E】Anton and Tree【缩点+DP】
- [codeforces 734E]Anton and Tree
- 【CodeForces734E】【缩点】Anton and Tree 题解
- 【27.91%】【codeforces 734E】Anton and Tree
- codeforces 734 E. Anton and Tree (黑红树,缩点+dfs)
- 思路题,树的直径(Anton and Tree,cf 734E)
- Anton and Tree CodeForces - 734E
- CodeForces 734 E.Anton and Tree(dfs)
- CodeForces 438 E.The Child and Binary Tree(生成函数+FFT)
- codeforces 682C Alyona and the Tree DFS
- CodeForces 785 D.Anton and School - 2(组合数学)
- CodeForces 682C - Alyona and the Tree(dfs)
- Codeforces 514E. Darth Vader and Tree DP+矩阵快速幂
- codeforces 514E E. Darth Vader and Tree(矩阵应用)
- 【codeforces 785D】Anton and School - 2
- 【codeforces 785B】Anton and Classes
- codeforces741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
- 342E Xenia and Tree——codeforces
- codeforces-342E-Xenia and Tree