基础实验6-2.2 汉密尔顿回路 (25 分)【最后一个结点未通过】
2019-09-24 11:20
357 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/treblez/article/details/101266036
基础实验6-2.2 汉密尔顿回路 (25 分)
著名的“汉密尔顿(Hamilton)回路问题”是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1
次)。本题就要求你判断任一给定的回路是否汉密尔顿回路。输入格式: 首先第一行给出两个正整数:无向图中顶点数 N(2<N≤200)和边数 M。随后 M 行,每行给出一条边的两个端点,格式为“顶点1
顶点2”,其中顶点从 1 到N 编号。再下一行给出一个正整数 K,是待检验的回路的条数。随后 K 行,每行给出一条待检回路,格式为:n V 1 V 2 ⋯ V n
其中 n 是回路中的顶点数,V i 是路径上的顶点编号。
输出格式: 对每条待检回路,如果是汉密尔顿回路,就在一行中输出"YES",否则输出"NO"。
输入样例: 6 10 6 2 3 4 1 5 2 5 3 1 4 1 1 6 6 3 1 2 4 5 6 7 5 1 4 3 6 2 5 6
5 1 4 3 6 2 9 6 2 1 6 3 4 5 2 6 4 1 2 5 1 7 6 1 3 4 5 2 6 7 6 1 2 5 4
3 1 输出样例: YES NO NO NO YES NO
像是我以前做的那道1003一样,这道题目更重要的是分析。
满足汉密尔顿回路的充要条件是:
1.路径顶点数为顶点总数+1并且首尾相同
2.除了首部顶点之外,其它顶点只能访问一次,首部结点需要在头尾分别访问一次
3.相邻顶点之间必须有边
这样一看,就变得十分简单了。
但是。。。最后一个数据死活不通过。。。
算了,改天重新写一次
#include <stdio.h> #include<stdlib.h> #include <cstring> #include <iostream> #include <cstdio> #include<cstdlib> #include<iostream> using namespace std; #define MaxSize 205 typedef struct FNode* MGraph; struct FNode { int Nv, Ne; int data[MaxSize][MaxSize] = { 0 }; int maxsize; }; MGraph CreatGraph(int Nv, int Ne) { MGraph G = (MGraph)malloc(sizeof(struct FNode)); G->Ne = Ne; G->Nv = Nv; /* for (int i = 1; i <= Nv; i++) for (int j = 1; j <= Nv; j++) G->data[i][j] = 0;*/ int F, R; for (int i = 0; i < Ne; i++) { cin >> F >> R; G->data[F][R] = 1; G->data[R][F] = 1; } return G; } void judgement(MGraph G) { int n,first,rear,front,i; int jud = 1; cin >> n; int* decide; decide = (int*)malloc(sizeof(int) * (MaxSize)); for (int i = 1; i <= n; i++) decide[i] = 0;//判断访问次数的数组 if (n != G->Nv + 1) jud = 0; if (jud) { cin >> first; rear =front= first; for (i = 1; i < n; i++) { cin >> front; if (G->data[rear][front] != 1 || decide[front] != 0)//不联通或者已经被访问过 jud = 0; decide[front]++; rear = front; } //先读取完数据再做判断 if (front != first) jud = 0;//如果最后没有返回首节点 } else { for (i = 0; i < n; i++) cin >> front; } if (jud) cout << "YES" << endl; else cout << "NO" << endl; } int main() { int Nv, Ne, K; cin >> Nv >> Ne; MGraph G = CreatGraph(Nv, Ne); cin >> K; while (K--) judgement(G); return 0; }
相关文章推荐
- Cisco基础实验回顾1--通过Console口访问路由器
- 7-4 汉密尔顿回路(25 分) 【STL】
- 帧中继point-to-point基础实验2.2
- 实验2.2 单链表实现成绩管理——基础操作的实现
- 汉密尔顿回路 (25 分)
- Cisco基础实验回顾2--通过Telnet访问路由器
- java线程基础巩固---通过实验分析This锁和Class锁的存在
- 基础实验6-2.3 拯救007 (25 分)
- 25-UI基础通过控件的 transform 属性,对控件进行移动,缩放,旋转操作,(补充简单动画)
- [实验报告]C++第5次实验(基础班)—数组
- Linux多任务编程(三)---exec函数族及其基础实验
- Linux进程间通信(四)---信号通信之信号发送捕捉kill()、raise()、alarm()、pause()及其基础实验
- 20155335 俞昆 《信息安全系统设计基础》实验五
- 20145231熊梓宏 《网络对抗》 实验5 MSF基础应用
- 20145203 《信息安全系统设计基础》实验三 实时系统的移植
- 2.25机器学习数学基础笔记
- 通过sqli-labs学习sql注入——基础挑战之less1
- 20135327郭皓——信息安全系统设计基础----第五周实验四
- 【linux基础】25、openssl基础