编程之美15-彩色的树
来源:互联网 发布:网络在线咨询图片 编辑:程序博客网 时间:2024/06/04 18:44
看第一眼以为这个题不好做,把过多的时间浪费在第二题上了。《彩色的树》这题是一个顶点染色的问题,用点dfs去不断染色,然后记录子树的个数就好,题目的内容如下:
给定一棵n个节点的树,节点编号为1, 2, …, n。树中有n - 1条边,任意两个节点间恰好有一条路径。这是一棵彩色的树,每个节点恰好可以染一种颜色。初始时,所有节点的颜色都为0。现在需要实现两种操作:
改变节点x的颜色为y;
询问整棵树被划分成了多少棵颜色相同的子树。即每棵子树内的节点颜色都相同,而相邻子树的颜色不同
直接贴代码了,我的代码没有按时提交,不排除有错误。
#include <stdio.h>#include <map>#include <iostream>#include <string>#include <vector>#include <math.h>#include <string.h>#include <stdlib.h>#include <algorithm>#define INF 99999999#define MAX_V 200000using namespace std;int vist[10001];int ma;int N;int color[MAX_V];vector<int> G[MAX_V];void dfs(int i) { vist[i] = 1; int k; for(k=0; k<G[i].size();k++) { if(color[i]==color[G[i][k]] && vist[G[i][k]] == 0) { dfs(G[i][k]); } } return;}int main(int argc, char* argv[]){ freopen("input.txt", "r", stdin); int TC,C; int i,j; int a,b,q,l,m,n; cin>>TC; for( C = 1; C <= TC; C++) { cin>>N; memset(vist, 0, sizeof(vist)); ma = 0; for(i = 0; i<N-1; i++) { color[i+1] = 0; cin>>a>>b; G[a].push_back(b); G[b].push_back(a); } color[N] = 0; memset(vist, 0, sizeof(vist)); for(i = 1; i<= N; i++) { if(vist[i]==0){ ma++; dfs(i); } } cin>>q; cout<<"Case #"<<C<<":"<<endl; for(i = 0; i<q; i++) { cin>>l; if(l==1) { cout<<ma<<endl; continue; } cin>>m>>n; color[m] = n; ma=0; memset(vist, 0, sizeof(vist)); for(j = 1; j<= N; j++) { if(vist[j]==0){ ma++; dfs(j); } } } } return 0;}
0 0
- 编程之美15-彩色的树
- 编程之美 彩色的树
- 2015编程之美 彩色的树
- 2015编程之美 彩色的树
- 2015 编程之美彩色的树A
- hihoCoder #1156 : 彩色的树 2015编程之美初赛
- 2015编程之美初赛第一场 A 彩色的树
- hihoCoder 1156 彩色的树 编程之美2015初赛第一场
- 编程之美--树
- 编程之美的诱惑
- 编程之美的题目
- erlang的编程之美
- 编程之美系列之二叉树的分层遍历
- 《编程之美》背后的作者之美
- 编程之美之1的数目
- 编程之美之1的数目
- [编程之美]二叉树的层次遍历
- 编程之美2.5 寻找最大的k个树
- linux系统中如何查看日志 (常用命令)
- 使用正则表达式校验微信号
- 将数组a中n个元素按相反顺序存放
- TCP/IP
- 机房收费系统重构(2)——未声明“ConfigurationManager”
- 编程之美15-彩色的树
- Linux-(10)Linux中的用户和组
- Hibernate中session的clear(),flush(),evict()方法详解
- 【poj2152】【Fire】【树形dp】
- 一个多月来的面试总结(阿里, 网易, 腾讯)
- Struts2 Result详解
- BZOJ3996【最小割】
- PowerDesigner 中的模型图介绍和建模顺序
- 3.0优化查询-引入视图