标签:编程之美
题目1 : 彩色的树5
<span style="font-size:14px;">#include <iostream>
#include <vector>
#include <map>
using namespace std;
//利用hash_map存储边信息,利用vector存储节点的颜色信息, 时间复杂度:O(nlogn)
int main()
{
int n;
multimap<int, int> matrix; //存储边的信息
while(cin>>n)
{
//cout<<"n="<<n<<endl;
for(int i=1; i<=n; i++)
{
cout<<"Case #"<<i<<":"<<endl;
int node_n;
cin>>node_n;
//cout<<"node_n="<<node_n<<endl;
vector<int> node(node_n, 0); //存储节点的颜色值
int a = 0, b = 0;
for(int j=0; j<node_n-1; j++)
{
cin>>a>>b;
//cout<<"a="<<a<<", b="<<b<<endl;
matrix.insert(pair<int, int>(a-1, b-1)); //插入边信息
}
//cout<<"matrix.size="<<matrix.size()<<endl;
int oper_n;
cin>>oper_n;
int option = 0;
int nodeth = 0, color = 0;
bool no2Flag = false;
bool again1Flag = false;
for(int j=0; j<oper_n; j++)
{
cin>>option;
if(option == 1 && !no2Flag) //一直没有节点颜色改变的情况
cout<<1<<endl;
else if(option == 1 && no2Flag) //有节点颜色改变的情况下,求划分子树的个数
{
int result = 0;
for(int k=0; k<node_n; k++) //计算划分子树的个数
{
bool sameFlag = false; //某节点是否有颜色相同的子节点的标志
int count = matrix.count(k); //某一节点与子节点的边个数
multimap<int, int>::iterator iter; //multimap的迭代器
if(count)
iter = matrix.find(k); //寻找第一条与子节点的边
while(count--)
{
if(node[k] == node[iter->second]) //母节点与子节点的颜色一样
{
sameFlag = true; //记录此节点有颜色相同的相邻节点的标志
break; //停止此节点与其他子节点的比较
}
}
if(!sameFlag) //此节点没有颜色相同的相邻节点的情况
result++; //子树个数加1
}
cout<<result<<endl;
again1Flag = true;
}
else if(option == 1 && again1Flag) //有节点改变的情况下,连续出现1的命令
cout<<result<<endl;
else if(option == 2) //命令为2的情况
{
cin>>nodeth>>color;
node[nodeth-1] = color; //修改此节点的颜色值
no2Flag = true; //修改节点颜色改变的标志
again1Flag = false; //不再连续出现1命令
}
}
matrix.clear();
}
}
return 0;
}
</span>标签:编程之美
原文地址:http://blog.csdn.net/zuijinhaoma8/article/details/45342321