当前位置: 首页 > web >正文

【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

    • 题目
    • 代码

题目

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

在这里插入图片描述

可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(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

代码

#include <stdio.h>
#include <stdlib.h>#define MAX_N 1000// 邻接表节点结构
typedef struct Node {int vertex;struct Node* next;
} Node;// 并查集结构
typedef struct {int parent[MAX_N + 1];int rank[MAX_N + 1];
} UnionFind;// 初始化并查集
void initUnionFind(UnionFind* uf, int n) {for (int i = 1; i <= n; i++) {uf->parent[i] = i;uf->rank[i] = 1;}
}// 查找根节点并路径压缩
int find(UnionFind* uf, int x) {if (uf->parent[x] != x) {uf->parent[x] = find(uf, uf->parent[x]);}return uf->parent[x];
}// 合并两个集合
void unionSets(UnionFind* uf, int x, int y) {int xRoot = find(uf, x);int yRoot = find(uf, y);if (xRoot == yRoot) return;if (uf->rank[xRoot] < uf->rank[yRoot]) {uf->parent[xRoot] = yRoot;} else if (uf->rank[xRoot] > uf->rank[yRoot]) {uf->parent[yRoot] = xRoot;} else {uf->parent[yRoot] = xRoot;uf->rank[xRoot]++;}
}int main() {int n, m;scanf("%d %d", &n, &m);// 记录每个顶点的度数int degree[MAX_N + 1] = {0};// 初始化并查集UnionFind uf;initUnionFind(&uf, n);// 处理每条边for (int i = 0; i < m; i++) {int u, v;scanf("%d %d", &u, &v);// 更新度数degree[u]++;degree[v]++;// 合并两个顶点所在的集合unionSets(&uf, u, v);}// 检查所有边是否在同一个连通分量中int root = -1;int hasEdge = 0;for (int i = 1; i <= n; i++) {if (degree[i] > 0) {hasEdge = 1;if (root == -1) {root = find(&uf, i);} else if (find(&uf, i) != root) {// 存在多个连通分量printf("0\n");return 0;}}}// 如果没有边,特殊处理if (!hasEdge) {printf("0\n");return 0;}// 检查所有顶点的度数是否为偶数for (int i = 1; i <= n; i++) {if (degree[i] % 2 != 0) {printf("0\n");return 0;}}// 所有条件满足,存在欧拉回路printf("1\n");return 0;
}    
http://www.xdnf.cn/news/16030.html

相关文章:

  • C# Lambdab表达式 Var 类
  • Elupload实现多个文件上传与已上传列表中做对比,若重复则只保留已上传列表中的数据,同时告诉用户,有哪些文件重复上传了
  • 搭建种草商城框架指南
  • 飞算科技:以原创技术为翼,赋能产业数字化转型
  • Linux第三课:需要自己安装的远程登录工具PuTTY的介绍
  • 【PTA数据结构 | C语言版】求单源最短路的Dijkstra算法
  • Taro 本地存储 API 详解与实用指南
  • G7打卡——Semi-Supervised GAN
  • EMBMS1820芯祥科技18单元电池监控器芯片数据手册
  • 华控的科技布局——全球化战略与合作生态
  • 力扣(LeetCode)第 161 场双周赛
  • macbookpro m1 max本儿上速搭一个elasticsearch+kibana环境
  • 基于deepseek的LORA微调
  • 【设计模式C#】简单工厂模式(用于简化获取对象实例化的复杂性)
  • 个人中心产品设计指南:从信息展示到用户体验的细节把控
  • mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程
  • 在.NET Core API 微服务中使用 gRPC:从通信模式到场景选型
  • uniapp使用uni-ui怎么修改默认的css样式比如多选框及样式覆盖小程序/安卓/ios兼容问题
  • taro微信小程序的tsconfig.json文件说明
  • Hyperledger Fabric V2.5 生产环境部署及安装Java智能合约
  • 从env到mm_struct:环境变量与虚拟内存的底层实现
  • 来伊份养馋记社区零售 4.0 上海首店落沪:重构 “家门口” 的生活服务生态
  • Django实战:基于Django和openpyxl实现Excel导入导出功能
  • AWS IoT Core CloudWatch监控完整指南
  • 前端包管理工具深度对比:npm、yarn、pnpm 全方位解析
  • 【React】npm install报错npm : 无法加载文件 D:\APP\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
  • 宝塔面板Nginx报错: IP+端口可以直接从访问,反向代理之后就504了 Gateway Time-out
  • 使用 Strands Agents 开发并部署生产级架构通用型个人助手
  • 第三章自定义检视面板_创建自定义编辑器类_编扩展默认组件的显示面板(本章进度3/9)
  • 前端开发者快速理解Spring Boot项目指南