欧拉回路
七桥问题#
看上面的无向图,七桥问题就是存不存在一条道路,能够完整地不重复的走完这些边。
欧拉回路和欧拉路径#
欧拉路径就是满足上面问题的一个通路,如果这个通路还是一个回路,称为欧拉回路。
首先,不管图是什么样的,要满足欧拉回路,首先图得是连通图,这是基本条件,本篇默认所有图都是连通的,包括应用题中的输入数据也一定是连通图。
无向图#
对于无向图,因为每条边只能经过一次,所以如果想得到欧拉回路,必须满足节点连接的边是偶数个
。可以在纸上画一下。
而对于欧拉路径,它也有可能是欧拉回路,也有可能不是,如果不是的话,起点和终点连接的边是奇数。
所以
- 欧拉回路:图中所有节点的度是偶数
- 欧拉路径:图中奇数度的节点为0个或2个
有向图#
对于有向图,如果想得到欧拉回路,那么每个节点的入度必定等于出度。
如果是欧拉路径,则有一个节点的入度比出度小1,这个节点是起点,有一个节点的出度比入度小1,这个节点是终点。
- 欧拉路径:图中所有节点入度等于出度
- 欧拉回路:图中只有一个节点入度比出度小1,也只有一个节点入度比出度大1,剩下的入度等于出度
应用#
输入n(n≤100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同(例如acm、malform、mouse)。每个单词最多包含1000个小写字母。输入中可以有重复单词。
把单词看作边,字母看作节点,那么acm
这个单词就表示字母a
的入度加一,字母m
的出度加一。
然后只需要按上面的判断方式判断即可。
PS: 该程序并未判断图的连通性
#include "iostream"
#include "cstdio"
#include "string"
#define MAX 10000
using namespace std;
int in[26],out[26];
int main() {
string word;
while (cin >> word && word!="#") {
in[word[0] - 'a']++;
out[word[word.length() - 1] - 'a']++;
}
int a=0, b=0;
for (int i = 0; i < 26; i++) {
if (in[i] != out[i]) {
if (in[i] + 1 == out[i])a++; // 可能是起点,因为起点入度可能小1
else if (in[i] == out[i] + 1)b++; // 可能是终点,因为终点出度可能小1
else {
printf("Faild!");
return 0;
}
}
}
if (a && b && a + b > 2) {
printf("Faild!");
return 0;
}
printf("OK");
return 0;
}
参考#
作者:Yudoge
出处:https://www.cnblogs.com/lilpig/p/13950651.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
欢迎按协议规定转载,方便的话,发个站内信给我嗷~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)