7-32 哥尼斯堡的“七桥问题” (25 分)(思路+详解+题目分析)两种做法任选其一

一:题目:

哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示。

可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学。

这个问题如今可以描述为判断欧拉回路是否存在的问题。欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?

输入格式:
输入第一行给出两个正整数,分别是节点数N (1≤N≤1000)和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。

输出格式:
若欧拉回路存在则输出1,否则输出0。

输入样例1:

6 10
1 2
2 3
3 1
4 5
5 6
6 4
1 4
1 6
3 4
3 6

输出样例1:

1

输入样例2:

5 8
1 2
1 3
2 3
2 4
2 5
5 3
5 4
3 4

输出样例2:

0

二:思路分析

思路:
判断欧拉回路:
有向图:所有的顶点出度=入度(临接表)。
无向图:所有顶点都是偶数度(临接表)。

	还有一个前提是 图得是连通的(两种判断方法都有解释)	 

知识快递:用到DFS遍历 和 并查集 不熟悉的可以点进去看一下哈

DFS知识速递
并查集知识速递

三:上码(用DFS遍历输出的元素个数来判断图是否连通)

/**思路:判断欧拉回路:有向图:所有的顶点出度=入度(临接表)。无向图:所有顶点都是偶数度(临接表)。还有一个前提是 图得是连通的	 */#include<bits/stdc++.h>
using namespace std;typedef struct GNode * PtrGraph;
typedef struct GNode{int Nv;int Ne;int Date[1000][1000];
}gnode;int visited[1000] = {0};
vector<int>v;void createGraph(PtrGraph G){int N,M;cin >> N >> M;G->Nv = N;G->Ne = M;//邻接矩阵初始化 for( int i = 1; i <= G->Nv; i++ ){for( int j = 1; j <= G->Nv; j++ ){G->Date[i][j] = 0;}}//往邻接矩阵当中进行赋值 如果这两个点相连就赋值 1 for(int i = 0; i < G->Ne; i++ ){int a,b;cin >> a >> b;G->Date[a][b] = 1;G->Date[b][a] = 1;//因为是无向图嘛 所以得再来一个		} 		
} 
//来验证建立的邻接矩阵是否正确 
void printGraph(PtrGraph G){for( int i = 1; i <= G->Nv; i++){for( int j = 1; j <= G->Nv; j++)cout << G->Date[i][j] << ' '; cout << endl;}	
} //引入DFS遍历 主要是用与判断遍历顺序的个数是否等于结点数  如果不等于就是不连通
void DFS_Graph(PtrGraph G,int a){int temp = a;v.push_back(temp);visited[a] = 1;for( int i = 1; i <= G->Nv; i++ ){if( visited[i] != 1 && G->Date[a][i] == 1){DFS_Graph(G,i); } }
} //处理度数问题(即该结点有多少分支 就有多少度)
int judgenment(PtrGraph G){for( int i = 1; i <= G->Nv; i++ ){int count = 0; //用于统计某个结点的度数 for(int j = 1; j <= G->Nv; j++ ){if(G->Date[i][j] == 1)count++;}if( count % 2 != 0){return 1;} }return 0;	} int main(){PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));createGraph(G);
//	printGraph(G);DFS_Graph(G,1);//cout << v.size();int flag1 = judgenment(G);int flag2 = v.size();if( flag1 == 0 && flag2 == G->Nv ){cout << "1";}else{cout << "0";}} 

四:上嘛(第二种做法 就是用到并查集来处理 判断图的连通问题)

#include<bits/stdc++.h>
using namespace std;typedef struct GNode * PtrGraph;
typedef struct GNode{int Nv;int Ne;int Date[1001][1001];
}gnode;int N,M;
int Father[1001]; void init(){for( int i = 1; i <= N; i++ )Father[i] = i;	
} int find( int a ){int r=a;while(Father[r]!=r)r=Father[r];		//找到他的前导结点int i=a,j;while(i!=r){	//路径压缩算法j=Father[i];	//记录x的前导结点Father[i]=r;	//将i的前导结点设置为r根节点i=j;}return r;
}
//合并
void merg( int x,int y){int a = find(x);//查询x的根节点 int b = find(y);//查询y的根节点if(a != b )Father[b] = a;//如果根节点不一样的话 将索引值b 的根节点设为 a 
} //创建图 
void createGraph(PtrGraph G){cin >> N >> M;G->Nv = N;G->Ne = M;init();//邻接矩阵初始化 for( int i = 1; i <= G->Nv; i++ ){for( int j = 1; j <= G->Nv; j++ ){G->Date[i][j] = 0;}}//往邻接矩阵当中进行赋值 如果这两个点相连就赋值 1 for(int i = 0; i < G->Ne; i++ ){int a,b;cin >> a >> b;merg(a,b);G->Date[a][b] = 1;G->Date[b][a] = 1;//因为是无向图嘛 所以得再来一个		} 		
} //处理度数问题(即该结点有多少分支 就有多少度)
int judgenment(PtrGraph G){for( int i = 1; i <= G->Nv; i++ ){int count = 0; //用于统计某个结点的度数 for(int j = 1; j <= G->Nv; j++ ){if(G->Date[i][j] == 1)count++;}if( count % 2 != 0){return 1;} 	 }return 0;	} int main(){int flag1,flag2 = 0;PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));createGraph(G);//如果是连通的则最后的根节点为 一个值 否则出现其他值即该图不连通 for( int i = 1; i <= N; i++ ){if( Father[i] == i )flag2++;}flag1 = judgenment(G);if( flag1 == 0 && flag2 == 1 ){cout << "1";}else{cout << "0";}} 

在这里插入图片描述

五:总结

今天看Java视频学到了 一个新词 叫 菜牛;哈哈哈哈,我知道有菜鸟,大牛 ,第一次听说菜牛 哈哈! 晚上刷题时,看到欧拉回路,我根本就不知道是啥,自己的离散数学都忘的差不多了,那就跟平时做题一样,遇到什么不懂就查阅,拿到结果来做题。这个题就是一个判断图的连通是否,和无向图中每个结点的度数都为偶数即为欧拉回路,40分钟就敲完了。下班的早我就上网上看下别人的代码,毕竟肯定有比自己更好的码子,所以就看到了其他人的做法,用到了并查集,我一下就有兴趣了,因为并查集我就用过一次不是特别的熟练(上一次用还是在PTA题目 朋友圈那里),所以出于复习的目的,我决定改改,看了一个码,人家用并查集来处理图的联通问题,虽然学过一遍并查集,而且还做过一道题,但还是忘了,于是又看了一遍。这就又验证了一句话 重复就是最好的老师,边数多了,死知识才能活学活用。

加油别放弃,啥前敲代码也能成为一种放松方式,累了 困了 不喝乐虎了,改为敲上一段代码 哈哈哈哈哈哈 加油加油

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一次简单的服务器 cpu 占用率高的快速排查实战

前两天&#xff0c;朋友遇到一个线上 cpu 占用率很高的问题&#xff0c;我们俩一起快速定位并解决了这个问题。在征求朋友同意后&#xff0c;特发此文分享整个过程。本文以对话的形式展开&#xff0c;加上我的内心独白。文中对话与实际对话略有出入。友&#xff1a; 在吗&#…

7-33 地下迷宫探索 (30 分)(思路加详解)

一&#xff1a;题目 7-33 地下迷宫探索 (30 分)地道战是在抗日战争时期&#xff0c;在华北平原上抗日军民利用地道打击日本侵略者的作战方式。地道网是房连房、街连街、村连村的地下工事&#xff0c;如下图所示。 我们在回顾前辈们艰苦卓绝的战争生活的同时&#xff0c;真心钦…

联通定时休眠5G基站 戳破皇帝的新衣

近年来&#xff0c;5G被欧美政客、大公司、媒体连番炒作&#xff0c;在公开舆论上&#xff0c;5G成为了“科技制高点”&#xff0c;成为决定国家命运的“外星科技”&#xff0c;个别明星企业家还声称&#xff0c;“5G改变社会”&#xff0c;“5G应用后美国将成为落后国家”。但…

java中的线程不安全和实例解析

一&#xff1a;引言&#xff08;特指单核&#xff09; 所谓线程不安全&#xff0c;就是在共享数据时&#xff0c;不同的线程在执行时&#xff0c;出现数据的不准确&#xff0c;&#xff08;以模拟抢票和模拟银行取钱为例&#xff09;&#xff0c;那么我们的线程不安全具体指的…

记近一年线上项目经验及架构变更记录

简介M 项目, 是一个电子社保业务系统&#xff0c;2019.8 月团队接手了这个项目的开发工作&#xff0c;到 2020.7 月客户的业务量翻了&#xff14;倍&#xff0c;工作日同时在线员工数量&#xff14;&#xff10;人&#xff0c;以下记录总结 2019.8-至今项目的架构变化&#xff…

拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)

一&#xff1a;引言 既然是一种排序&#xff0c;那么肯定是按照某种规则进行排序&#xff0c;那么这么想的话&#xff0c;先了解基本知识&#xff0c;再来实战演练 1. AOV网&#xff08;Activity On Vertex Network)【顶点——表示活动】 是一个——有向无回路的图 顶点——表…

7-34 任务调度的合理性 (25 分)(思路加详解+兄弟们冲呀)

一&#xff1a;题目 假定一个工程项目由一组子任务构成&#xff0c;子任务之间有的可以并行执行&#xff0c;有的必须在完成了其它一些子任务后才能执行。“任务调度”包括一组子任务、以及每个子任务可以执行所依赖的子任务集。 比如完成一个专业的所有课程学习和毕业设计可…

.NET和.NET Core Web APi FormData多文件上传

【导读】最近因维护.NET和.NET Core项目用到文件上传功能&#xff0c;虽说也做过&#xff0c;但是没做过什么对比&#xff0c;借此将二者利用Ajax通过FormData上传文件做一个总结&#xff0c;通过视图提交表单太简单&#xff0c;这里不做阐述&#xff0c;希望对有需要的童鞋能有…

在ubuntu上实现基于webrtc的多人在线视频聊天服务

最近研究webrtc视频直播技术&#xff0c;网上找了些教程最终都不太能顺利跑起来的&#xff0c;可能是文章写的比较老&#xff0c;使用的一些开源组件已经更新了&#xff0c;有些配置已经不太一样了&#xff0c;所以按照以前的步骤会有问题。折腾了一阵终于跑起来了&#xff0c;…

java并发练习之快乐影院

一&#xff1a;引言 这里是加了个同步块&#xff0c;来保证数据的准确性&#xff0c;用了个容器使&#xff0c;我们可以选位置 二&#xff1a;上码&#xff08;这里是模拟在电影院选位置&#xff09; package com.wyj.three;import java.util.ArrayList; import java.util.L…

Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)

前言本文主要是讲解如何使用Azure DevOpsDocker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目).上一篇:Azure DevOpsDockerAsp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐今天我们废话不多说 直接开始正文 …

7-35 城市间紧急救援 (25 分)(思路加详解)

一&#xff1a;题目 作为一个城市的应急救援队伍的负责人&#xff0c;你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候&#xff0…

程序员修神之路--那些分布式事务解决方案

亲爱的,关注我吧为了保证分布式环境下数据强一致性&#xff0c;需要引入分布式事务&#xff0c;而分布式事务由于网络环境的不确定性&#xff0c;天生就很难实现。具体可以见上一篇。[分布式下&#xff0c;我想要强一致性]为了保证分布式事务的正确性&#xff0c;目前互联网领域…

7-36 社交网络图中结点的“重要性”计算 (30 分)(思路加详解)兄弟们PTA乙级题目冲起来

一&#xff1a;题目 在社交网络中&#xff0c;个人或单位&#xff08;结点&#xff09;之间通过某些关系&#xff08;边&#xff09;联系起来。他们受到这些关系的影响&#xff0c;这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互作用&#xff0c;可以增强也可以减…

分享几个亲测有效的高效工作技巧

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「154」篇原创敬上大家好&#xff0c;我是Z哥。在工作中&#xff0c;你会发现有的小伙伴每天看上去很忙&#xff0c;但是好像产出的成果比旁边看上去工作轻松甚至有…

7-37 模拟EXCEL排序 (25 分)(思路+详解+超时解决 兄弟们冲呀呀呀呀呀呀)

一&#xff1a;题目 Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。 输入格式: 输入的第一行包含两个正整数N(≤10 5 ) 和C&#xff0c;其中N是纪录的条数&#xff0c;C是指定排序的列号。之后有 N行&#xff0c;每行包含一条学生纪录。每条学生纪录由学号…

Azure DevOps+Docker+Asp.NET Core 实现CI/CD(三.实现CD持续部署管道)

前言本文主要是讲解如何使用Azure DevOpsDocker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目).上一篇:Azure DevOpsDockerAsp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)Azure DevOpsDockerAsp.NET Core 实现CI/CD(二.创建CI持续集成管道)觉得有帮助的朋友~可…

7-1 寻找大富翁 (25 分)(思路加详解+两种做法(一种优先队列,一种vector容器))

一&#xff1a;题目 胡润研究院的调查显示&#xff0c;截至2017年底&#xff0c;中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值&#xff0c;请快速找出资产排前M位的大富翁。 输入格式: 输入首先给出两个正整数N&#xff08;≤10 6 &#xff09;和M…

7-39 魔法优惠券 (25 分)(思路加解释 用容器做的)加油兄弟们

一&#xff1a;题目 在火星上有个魔法商店&#xff0c;提供魔法优惠券。每个优惠劵上印有一个整数面值K&#xff0c;表示若你在购买某商品时使用这张优惠劵&#xff0c;可以得到K倍该商品价值的回报&#xff01;该商店还免费赠送一些有价值的商品&#xff0c;但是如果你在领取…

.NET Core Web APi大文件分片上传研究

【导读】前两天发表利用FormData进行文件上传.NET和.NET Core Web APi FormData多文件上传&#xff0c;然后有人问要是大文件几个G上传怎么搞&#xff0c;常见的不就是分片再搞下断点续传&#xff0c;动动手差不多也能搞出来&#xff0c;只不过要深入的话&#xff0c;考虑的东西…