DS实验题 Old_Driver UnionFindSet结构
题目
思路
很典型的并查集问题,朋友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结构的更多相关文章
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...
- DS实验题 融合软泥怪-2 Heap实现
题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...
- DS实验题 Dijkstra算法
参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...
- DS实验题 sights
算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...
- DS实验题 order
算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...
- DS实验题 PlayGame Kruskal(UnionFindSet)
题目: 思路: 有两种做法,一种是Prim算法,另外一种则是我所使用的Kruskal算法,Kruskal的算法实现可以参考:最小生成树-Prim算法和Kruskal算法,讲的已经是十分清楚了. 具体算 ...
- DS实验题 Missile
题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...
- DS实验题 Order 已知父节点和中序遍历求前、后序
题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...
- DS实验题 Inversion
题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...
随机推荐
- Java关于队列的自我实现
1.循环队列的封装 package com.pinjia.shop.common.collection; /** * Created by wangwei on 2016/12/29. * 循环队列的 ...
- JPush Wiki
极光推送包含有通知与自定义消息两种类型的推送.本文描述他们的区别,以及建议的应用场景. 功能角度 通知 或者说 Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通知信息. ...
- 移动App该如何保存用户密码(转)
原文地址:http://blog.csdn.net/hengyunabc/article/details/34623957 移动App该如何保存用户密码? 这个实际上和桌面程序是一样的. 先看下一些软 ...
- PHP生成不重复随机数的方法
无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下. 方法一: ...
- 在HTML中优雅的生成PDF
关键代码<script type=</text> </para> <para align=" value=" ...
- loj 1251(2-sat + 输出一组可行解)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26961 思路:u表示留下,~u表示离开,同理v,对于+u,-v,我 ...
- Android中Dialog
在Android中,Dialog是一个非常重要的UI, 它可以方便的给用户提示,用最简洁的方式向用户展示信息, 以下的图片是Dialog的一个整体架构,通过它,可以总体对Dialog有一个很清晰的认识 ...
- LilyPad Arduino可穿戴技术和电子织物控制器板简介
LilyPad Arduino可穿戴技术和电子织物控制器板简介 第1章 LilyPad Arduino概览 作为本书的第一章,在这里将为读者介绍LilyPad Arduino相关的基础知识.例如,L ...
- 逆序数 POJ 2299 Ultra-QuickSort
题目传送门 /* 题意:就是要求冒泡排序的交换次数. 逆序数:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序. 一个排列中逆序的总数就称为这个排列的逆 ...
- Color a Tree[HDU1055]
Color a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...