
将数组初始化为0;
令k=0;
寻找着色规范的点;
规范则输出;
否则重新着色;
2.3 代码截图



刚开始未注意到不同颜色的个数相加需等于k。
以及未把c改成c++。
初始化并查集;
判断两人是否为朋友;
是记录是朋友 ;否记录是敌人;
输入两个宾客;
有共同朋友就输出同一张桌子;



一开始不知如何判断两人是否为朋友关系,后用并查集解决,即只要判断是否处于同一棵树便能知两人是否处于同个朋友圈。
以及c未改成c++。




开始时未将函数初始化,导致错误。
以及c未换成c++。

void UFset() // 初始化
2 {
3 for (int i = 0; i < n; i ++)
4 parent[i] = -1;
5 }
6 int Find(int x) // 查找并返回结点x所属集合的根结点
7 {
8 int s; // 查找位置
9 for (s = x; parent[s]>=0; s = parent[s]); // 注意这里的 ;
10 while (s != x) // 优化方案 -- 压缩路径,使后续的查找
11 {
12 int tmp = parent[x];
13 parent[x] = s;
14 x = tmp;
15 }
16 return s;
17 }
18 // R1和R2是两个元素,属于两个不同的集合,现在合并这两个集合
19 void Union (int R1, int R2)
20 {
21 // r1位R1的根结点,r2位R2的根结点
22 int r1 = Find(R1), r2 = Find(R2);
23 int tmp = parent[r1] + parent[r2]; // 两个集合的结点个数之和(负数)
24 // 如果R2所在树结点个数 > R1所在树结点个数
25 // 注意parent[r1]和parent[r2]都是负数
26 if(parent[r1] > parent[r2]) // 优化方案 -- 加权法则
27 {
28 parent[r1] = r2; // 将根结点r1所在的树作为r2的子树(合并)
29 parent[r2] = tmp; // 跟新根结点r2的parent[]值
30 }
31 else
32 {
33 parent[r2] = r1; // 将根结点r2所在的树作为r1的子树(合并)
34 parent[r1] = tmp; // 跟新根结点r1的parent[]值
35 }
原文:https://www.cnblogs.com/hxfa/p/9195855.html