将数组初始化为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