5-32 哥尼斯堡的“七桥问题” (25分)

题目描述:

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

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

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

输入格式:

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

输出格式:

若欧拉回路存在则输出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

第一次我不自量力采用了BFS深度搜索的方式解决,果然最后两个测试点超时,下面 是我第一次尝试的代码:

#include<iostream>
#include<vector>
#define MAX 1000
using namespace std;
int g[MAX][MAX];
int from;
int been[MAX][MAX];
int cnt=1;
void clear(int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
been[i][j] = 0;
}
bool BFS(int fr,int n,int m)
{
//int been[MAX][MAX];
for(int j=1 ;j<=n;j++)
{
if(j!=fr && been[fr][j]==0 && g[fr][j]==1)
{
//cout<<"fr :"<<fr<<" to "<<j<<endl;
//cout<<"cnt is "<<cnt<<endl;
if(j==from)
{
if(cnt==m) return true;
//cout<<"减啦"<<endl;
//cnt--;
continue;
}
cnt++;
been[fr][j]=been[j][fr]=1;
if(cnt==m) return true;
return BFS(j,n,m);
}
}
return false;
}
int main()
{
int n,m,a,b;
cin>>n>>m;
int temp = m;
while(temp--)
{
cin>>a>>b;
g[a][b]=g[b][a] = 1;
}
for(int i=1;i<=n;i++)
{
clear(n);
cnt = 1;
from = i;
if(BFS(i,n,m)){
cout<<1;
return 0;
}
}
cout<<0;
return 0;
}

 
时间: 2024-12-29 11:32:29

5-32 哥尼斯堡的“七桥问题” (25分)的相关文章

7-1 哥尼斯堡的“七桥问题” (25 分)

哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707-1783)最终解决了这个问题,并由此创立了拓扑学. 这个问题如今可以描述为判断欧拉回路是否存在的问题.欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 输入格式: 输入第一行给出两个正整数,分别是节点数N (1)和边数M:随后的M行对应M条边,每行给

欧拉七桥问题的一种证明(原创)

这是从网上下载的一张图片. 分析: 1定义:首先出度与入度之和为奇数的点叫为奇点. 2定理:一个点的|入度-出度|≤1,当该点为奇点时取等号.且对于某点而言, 若入度-出度=1,则该点必然终点: 若入度-出度=-1,则该点必然为起点 证明:同一个人不可能从同一个地方连续出去两次,也不可能从另外一个地方连续进入某个地方两次. 所以对于一个点而言,出度和入度必须交替进行,所以|入度-出度|≤1,该点为奇点时取等号. 倘若入度-出度=1,则行走过程必然为入-出-入-出-...-入.最后一步是入,入完过

鸟哥私房菜第七章 Linux文件与目录管理

一.目录与路径 1.相对路径与绝对路径 2.目录的相关操作 以下为特殊目录: .        :代表此目录 ..       :代表上一层目录 -        :代表前一个工作目录 ~       :代表"目前用户身份"所在的主文件夹 ~account :代表account这个用户的主文件夹 注:根目录下上一层(..)与前(.)是同一个目录. (1)cd:切换目录(change directory) 语法: [[email protected] ~]# cd [相对路径或绝对路径]

软件课设第七天 8.25

今日完成的任务: 1.研究GMM(高斯混合模型)的运动模型检测算法: 2.研究KCF(滤波器)的运动目标跟踪算法: 3.初步熟悉了OpenCV. 明天的目标: 1.尝试根据算法流程图开始编写算法: 2.继续研究相关算法和软件. 每日小结: 今天稍微休息调整了一下,并没有做太多的工作,只是继续研究了两个相关算法.明天我准备和小组的其他组员一起尝试编写本项目的算法,由于本项目是用Python语言,所以刚开始写程序可能会有些困难,所以就边写边学吧. 原文地址:https://www.cnblogs.c

基础实验3-2.3 共享后缀的链表 (25分)

有一种存储英文单词的方法,是把单词的所有字母串在一个单链表上.为了节省一点空间,如果有两个单词有同样的后缀,就让它们共享这个后缀.下图给出了单词“loading”和“being”的存储形式.本题要求你找出两个链表的公共后缀. 函数接口定义: PtrToNode Suffix( List L1, List L2 ); 其中List结构定义如下: typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */

PTA数据结构与算法题目集(中文) 7-32

PTA数据结构与算法题目集(中文)  7-32 7-32 哥尼斯堡的“七桥问题” (25 分) 哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示. 可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学. 这个问题如今可以描述为判断欧拉回路是否存在的问题.欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个无向图,问是否存在欧拉回路? 输

UVA10129:Play on Words(欧拉回路)

Some of the secret doors contain a very interesting word puzzle. The team of archaeologists has to solve it to open that doors. Because there is no other way to open the doors, the puzzle is very important for us. 一些密门会包含有趣的文字谜,考古学家小队为了开门不得不解决它.别无他法,

《程序员的数学》

今天是星期日,10100天后是星期几? 我们不急于求出10100,而是像1,10,100,1000....这样,依次增加0的个数,观察其规律. 0的个数0                              1/7=0余1                                                                 →星期一1                             10/7=1余3                            

SDUT 3364 数据结构实验之图论八:欧拉回路

数据结构实验之图论八:欧拉回路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来. 能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学.欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡七桥问题,并证明了更为广泛的有关一笔画的三条结论,人们通常称之为欧拉定理.对于一个连通图,通常把