DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
2016-12-18 09:44
519 查看
题目见前文:DS实验题 Old_Driver UnionFindSet结构
这里使用邻接表存储敌人之间的关系,邻接表用指针实现:// // main.cpp // Old_Driver3 // // Created by wasdns on 16/12/18. // Copyright © 2016年 wasdns. All rights reserved. // #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct edge { edge *next; int num; //int len; }eg[105]; struct head { edge *next; int num; }h[105]; void IniList(int n) { int i; for (i = 1; i <= n; i++) { h[i].next = NULL; h[i].num = i; } } void CreatList(int x, int y) { edge *p1, *p2; p1 = new edge; p1 -> next = NULL; p1 -> num = y; p2 = new edge; p2 -> next = NULL; p2 -> num = x; //p2 -> len = leng; edge *p3, *p4; p3 = h[x].next; if (p3 == NULL) { h[x].next = p1; } else { while (p3 -> next != NULL) { p3 = p3 -> next; } p3 -> next = p1; } p4 = h[y].next; if (p4 == NULL) { h[y].next = p2; } else { while (p4 -> next != NULL) { p4 = p4 -> next; } p4 -> next = p2; } } bool isAnamy(int x, int y) { bool flag = false; edge* p = new edge; p = h[x].next; while (p != NULL) { if (p -> num == y) { flag = true; break; } p = p -> next; } return flag; } int fa[105]; void IniFUS(int n) { int i; for (i = 1; i <= n; i++) { fa[i] = i; } } int Find(int x) { int f = x; while (f != fa[f]) { f = fa[f]; } int i = x, j; while (i != f) { j = fa[i]; fa[i] = f; i = j; } return f; } void Union(int x, int y) { int xfa = Find(x); int yfa = Find(y); if (xfa != yfa) { fa[yfa] = xfa; } } void Query(int k) { int i; int x, y; for (i = 1; i <= k; i++) { cin >> x >> y; if (!isAnamy(x, y)) { 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; IniFUS(n); IniList(n); int i, x, y, z; for (i = 1; i <= m; i++) { cin >> x >> y >> z; if (z == 1) Union(x, y); else if (z == -1) { CreatList(x, y); CreatList(y, x); } } Query(k); return 0; }
2016/12/18
相关文章推荐
- DS实验题 Old_Driver UnionFindSet结构
- 数据结构之图-邻接表、及指针数组,链式存储
- 【数据结构】图邻接表存储实现
- 算法与数据结构基础8:C++实现有向图——邻接表存储
- C++ 单链表基本操作分析与实现 链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结
- 用邻接表的存储结构实现迪杰斯特拉算法
- 数据结构:图(邻接表存储 c++实现)
- 数据结构_图_邻接表做存储结构实现求无向图的连通分量_C++实现
- 数据结构之---C语言实现图的邻接表存储表示
- 数据结构实验1 链表 实现学生信息存储,功能 增删改查,实现 结构类型
- 以邻接表为存储结构的---图的算法实现
- 数据结构之---C语言实现图的邻接表存储表示
- 实现主附表结构的数据存储
- 存储过程实现对MS SQL表结构的操作
- 二、C++指针存储结构
- 线性表的链式存储结构之单链表结点类的实现_Java
- 线性表的链式存储结构之单链表类的实现_Java
- 线性表以顺序表为存储结构的实现(数据元素的类型为整型)
- 带权图(网)的邻接表存储的C++实现
- C++指针存储结构