题目:
有 N 个花园,按从 1 到 N 标记。在每个花园中,你打算种下四种花之一。
paths[i] = [x, y] 描述了花园 x 到花园 y 的双向路径。
另外,没有花园有 3 条以上的路径可以进入或者离开。
你需要为每个花园选择一种花,使得通过路径相连的任何两个花园中的花的种类互不相同。
以数组形式返回选择的方案作为答案 answer,其中 answer[i] 为在第 (i+1) 个花园中种植的花的种类。花的种类用 1, 2, 3, 4 表示。保证存在答案。

题目属于图的渲染~由于诸多限定条件仅仅须穷举出其中一个解即可~
思路~
1 将paths的所有元素存储在一副图graph中~
2 对各个节点进行边的遍历并染色(这是重点) 但是呢?怎么个染色法呢?
不妨可以这样思考~4种颜色设为bool类型 对N个节点一次进行染色~
首先第一个节点 先查询其邻点是否已染比如颜色k (这里颜色不妨用1,2,3,4替代) 当染了颜色k 遍在结果
集里面res[0]=k;之后若有其他节点的邻点是第一个节点 则可以直接取到res[0]也就是k这里将能取到的邻点都设置为true 也就是已经染色 即可 然后 穷举遍历 一次性即可完成操作

for(int i=0;i<N;i++){
vector<bool> used(5,0);
for(auto j: gragh[i])
    used[res[j]]=true;

for(int k=1;k<5;++k)
{
if(!used[k])res[i]=k;return;
}
}

emmmm 单单这样看代码的话 有可能不能较为深入的理解,那么 如何才能够较为深入地理解呢?
首先 对于其内涵的思想 ` 我们已知的是边的关系 也就是节点到节点之间是否存在路径~
所以第一步肯定是 构建图
我们这里的图为二维向量 第一维 是n个节点各自的信息 而第二维 也就是每个节点中包含的n个分量~ 则是此顶点到其他各个顶点的路径关系~ 此处仅仅包含两种 1 或 0 意义为 存在前者到后者的路径或者是不存在。 所以 可以根据边的关系 初始化图 ~ 然后第二步则为上述代码~在已经构建好的图中 依次遍历各顶点~ 首先看其邻接的顶点是否已经有了颜色 如果有 则换下一种颜色~ 没有则可染色 然后遍历下一个节点~ 因为题目不是要穷举所有的方法 所以~较为简单 随便染一个在其邻接点中尚未被使用过的颜色即可~ 所以有上述的代码描述~至于图的初始化 暂时就不写了 233~


hhhhhh
1 声望0 粉丝