题目

思路

很典型的并查集问题,朋友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. python基础——字符串和编码

    python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...

  2. 8.桥接模式(Bridge Pattern)

    using System; namespace ConsoleApplication6 { class Program { static void Main(string[] args) { // 创 ...

  3. git branch -D 大写的D 删除分支

    今天删除本地分支 git branch -d XXX 提示:  the branch  XXX is not fully merged 原因:XXX分支有没有合并到当前分支的内容 解决方法:使用大写的 ...

  4. C# Winform 文件编码批量转换工具

    在发布产品程序包时,往往需要对程序文件进行编码检查,写了一个可以批量修改文件编码格式的辅助工具,希望对有同样需求的童鞋有帮助. 1.程序界面: 2.核心代码: /// <summary> ...

  5. [原]AppPoolService-IIS应用程序池辅助类(C#控制应用程序池操作)

    using System.Collections.Generic; using System.DirectoryServices; using System.Linq; using Microsoft ...

  6. hdu 4576 概率dp **

    题意:Michael has a telecontrol robot. One day he put the robot on a loop with n cells. The cells are n ...

  7. 在Windows中使用MinGW编译X264

    转自:http://www.cnblogs.com/xiongjiaji/archive/2012/06/08/2541265.html 参考:http://ayobamiadewole.com/Bl ...

  8. Struts2标签实现for循环

    感悟:但是不建议使用这种方法,按照MVC框架的思想 ,应该把业务更多放在后台.前台尽量只进行数据展示. 转自:http://blog.csdn.net/guandajian/article/detai ...

  9. 电赛总结(二)——AD之STM32F102ZE单片机自带12位AD

    直接上程序即可 #ifndef __ADC_H #define __ADC_H #include "stm32f10x.h" #include "LCD3.2.h&quo ...

  10. 我与C++的不解情缘

    我是一个老实人,我当时报考C++真的全心是为了自己自考的免考,绝不是为了什么二级证,可是,进行到一半的时候,突然获悉,C++自我们这次开始,不作为免考科目了,当时我的心里啊,那个纠结,那个痛啊,随后, ...