题目

思路

很典型的并查集问题,朋友A和B要合并到一个统一的集合中,也就是Union(A, B)操作,在Union操作中需要先找到A所属的集合的代表元和B所属集合的代表元,也就是使用Find(A)和Find(B),如果它们的代表元不一样,则将B集合合并到A集合(pre[B_root] = A_root)。

在Find的过程中,使用了路径压缩算法,使用i记录当前节点,使用j记录当前i的上级:

1.用j记录i的上级 2.将i的上级改为i_root 3.i=j

本题中,另外一种关系,也就是敌人,可以用一个二维数组存储,或者用邻接表存储都可以。

代码:

//
// main.cpp
// UnionFindSet
//
// Created by wasdns on 16/12/15.
// Copyright © 2016年 wasdns. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int pre[1000]; int rela[105][105]; void Initial(int n)
{
memset(pre, 0, sizeof(pre));
memset(rela, 0, sizeof(rela)); for (int i = 1; i <= n; i++)
{
pre[i] = i;
}
} int Find(int a)
{
int fa = a; while (fa != pre[fa])
{
fa = pre[fa];
} int i = a, j; while (i != fa) //路径压缩算法。
{
j = pre[i]; //记录上级
pre[i] = fa; //修改当前上级为root
i = j; //来到原来的上级
} return fa;
} void Union(int a, int b)
{
int afa = Find(a);
int bfa = Find(b); if (afa != bfa)
{
pre[bfa] = afa; //b所属集合的名字,改为a所属集合的名字
}
} void CreatRela(int m)
{
int i; int x, y, r; for (i = 1; i <= m; i++)
{
cin >> x >> y >> r; if (r == 1) Union(x, y); else if (r == -1) { rela[x][y] = -1; rela[y][x] = -1;
}
}
} void Query(int k)
{
int i; int x, y; for (i = 1; i <= k; i++)
{
cin >> x >> y; if (rela[x][y] == 0)
{
if (Find(x) == Find(y)) {
cout << "Good job" << endl;
} else {
cout << "No problem" << endl;
}
} else
{
if (Find(x) == Find(y)) {
cout << "OK but..." << endl;
} else {
cout << "No way" << endl;
}
}
}
} int main()
{
int n, m, k; cin >> n >> m >> k; Initial(n); CreatRela(m); Query(k); return 0;
} /*
7 8 4
5 6 1
2 7 -1
1 3 1
3 4 1
6 7 -1
1 2 1
1 4 1
2 3 -1
*/

DS实验题 Old_Driver UnionFindSet结构的更多相关文章

  1. DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储

    题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...

  2. DS实验题 融合软泥怪-2 Heap实现

    题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...

  3. DS实验题 Dijkstra算法

    参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...

  4. DS实验题 sights

    算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...

  5. DS实验题 order

    算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...

  6. DS实验题 PlayGame Kruskal(UnionFindSet)

    题目: 思路: 有两种做法,一种是Prim算法,另外一种则是我所使用的Kruskal算法,Kruskal的算法实现可以参考:最小生成树-Prim算法和Kruskal算法,讲的已经是十分清楚了. 具体算 ...

  7. DS实验题 Missile

    题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...

  8. DS实验题 Order 已知父节点和中序遍历求前、后序

    题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...

  9. DS实验题 Inversion

    题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...

随机推荐

  1. IE的安全性设定增加“我的电脑”的安全性设定

    HKEY_CURRE-NT_USER\Software\Microsoft\Windows\CurrentVersion\InternetSettings\Zones\,在右边窗口中找到DWORD值“ ...

  2. 各大OJ

    北大POJ 杭电HDU 浙大ZOj 蓝桥杯 PAT

  3. MySQL Auto_Increment属性应用

        我们经常要用到唯一编号,以标识记录.在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成.MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据 ...

  4. javascript散列表实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. [译]ASP.NET 性能监控

    概述:在性能测试中性能监视器是非常强大的工具,本文主要简述了几个关键的计数器和相关的阈值. 监控性能计数器 很多的性能计数器在性能调优中是非常重要的,由于性能计数器太多,很多人不知道选择那些计数器. ...

  6. 对学长所谓“改变世界的游戏”《shield star》的运行感想-毛宇部分(完整版本请参考团队博客)

    对于学长项目<shield star>的思考和看法: Ryan Mao ((毛宇)  110616-11061171 试用了一下学长黄杨等人开发的<shield star>游戏 ...

  7. C#学习笔记(八)——定义类的成员

    一.成员的定义 1.定义字段 class Myclass { public int MyInt; } 可以使用readonly关键字,表示这个字段只能在执行构造函数的过程中赋值,或者由初始化语句赋值. ...

  8. Properties类的用法

    在java.util包下面有一个类Properties,该类主要用于读取以项目的配置文件(以.properties结尾的文件和xml文件). 一. Properties结构 类继承结构如下: clas ...

  9. POJ2407 Relatives(欧拉函数)

    题目问有多少个小于n的正整数与n互质. 这个可以用容斥原理来解HDU4135.事实上这道题就是求欧拉函数$φ(n)$. $$φ(n)=n(1-1/p_1)(1-1/p_2)\dots(1-1/p_m) ...

  10. The number of divisors(约数) about Humble Numbers[HDU1492]

    The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...