欧拉路径
判定定理 及 证明
有向图
- 欧拉路径: 有且仅有一个 ‘入度=出度+1’ 的点和一个 ‘出度=入度+1’ 的点(起点, 终点) 或 所有点 ‘入度=出度’
- 欧拉回路:所有点入度=出度(起/终点任意)
无向图
- 欧拉路径: 有且仅有两个 度数为奇数 的点(起点, 终点) 或 所有点 ‘度数均为偶数’
- 欧拉回路:所有点度数均为偶数(起/终点任意)
证明
- 每条边都要走一次, 所以对于每个中间点(非起点/终点), 走进来之后都要走出去, 所以入度=出度/度数均为偶数
- 对于起点/终点, 在开始/结束时可以只走出去/走进来, 所以入(出)度=出(入)度+1/度数为奇数
如何做到 ‘字典序最小’ ?
给 x 节点所有能到达的点排个序就行了, 哈哈哈哈
示例
- 注意: 要确保每条边只走一步!
#include <bits/stdc++.h> #define int long long #define double long double #pragma GCC optimize(3) using namespace std; const int N = 1e6 + 10, INF = 1e18; int n, m, b; int fst[N], idg[N], odg[N], st[N]; string s[N]; vector <pair <int, int>> e[N]; vector <int> ans; void Dfs(int x){ // cout << x << " "; for(int &i = st[x]; i < e[x].size();){ int id = e[x][i].first; // cout << id << "id "; Dfs(e[x][i++].second); ans.push_back(id); } } signed main(){ // freopen("1.in", "r", stdin); freopen("card.in", "r", stdin); freopen("card.out", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> b; for(int i = 1; i <= n; i++){ cin >> s[i]; int ps = 0, f = 1; for(int j = 0; j < s[i].size(); j++){ if(s[i][j] == '1'){ if(!ps){ ps = j + 1; fst[i] = j; continue; } if(((j + 1) - ps) % m != 0){ f = 0; break; } ps = j + 1; } } if(f == 0 || ps == 0){ cout << "-1\n"; return 0; } for(int j = 0; j < s[i].size(); j++){ if(s[i][j] == '0'){ if((j - fst[i]) % m == 0){ f = 0; break; } } if(s[i][j] != '0'){ if((j - fst[i]) % m != 0){ f = 0; break; } } } if(f == 0){ cout << "-1\n"; return 0; } int st = ((b - fst[i]) % m + m) % m; int ed = ((b - fst[i] + s[i].size()) % m + m) % m; e[st].push_back({i, ed}); idg[ed]++, odg[st]++; // cout << st << "+" << ed << "\n"; } for(int i = 1; i <= n; i++){ if(idg[i] != odg[i]){ cout << "-1\n"; return 0; } } for(int i = 0; i < m; i++){ sort(e[i].begin(), e[i].end()); } Dfs(0); if(ans.size() != n){ cout << "-1\n"; return 0; } reverse(ans.begin(), ans.end()); for(auto i : ans){ cout << i << " "; } cout << "\n"; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话