欧拉路径

判定定理 及 证明

有向图

  • 欧拉路径: 有且仅有一个 ‘入度=出度+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";
}
posted on   Bubble_e  阅读(164)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话



点击右上角即可分享
微信分享提示