编程之美15-彩色的树

来源:互联网 发布:网络在线咨询图片 编辑:程序博客网 时间:2024/06/04 18:44

       看第一眼以为这个题不好做,把过多的时间浪费在第二题上了。《彩色的树》这题是一个顶点染色的问题,用点dfs去不断染色,然后记录子树的个数就好,题目的内容如下:
       给定一棵n个节点的树,节点编号为1, 2, …, n。树中有n - 1条边,任意两个节点间恰好有一条路径。这是一棵彩色的树,每个节点恰好可以染一种颜色。初始时,所有节点的颜色都为0。现在需要实现两种操作:

  1. 改变节点x的颜色为y;

  2. 询问整棵树被划分成了多少棵颜色相同的子树。即每棵子树内的节点颜色都相同,而相邻子树的颜色不同
    直接贴代码了,我的代码没有按时提交,不排除有错误。

#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