首页 > 其他分享 >欧拉路径

欧拉路径

时间:2024-07-19 20:40:23浏览次数:9  
标签:度数 ps 终点 int 路径 入度 欧拉

欧拉路径

判定定理 及 证明

有向图

  • 欧拉路径: 有且仅有一个 ‘入度=出度+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";
}

标签:度数,ps,终点,int,路径,入度,欧拉
From: https://www.cnblogs.com/Bubblee/p/18312328

相关文章

  • docker修改默认镜像、容器路径
    停止dockersystemctlstopdocker迁移文件mkdir-p/data/docker/lib/docker/rsync-av/var/lib/docker//data/docker/lib/docker/修改配置#/etc/docker/daemon.json#在配置文件中添加以下参数"data-root":"/data/docker/lib/docker"启动dockersystemctldaemon......
  • 欧拉定理
    欧拉定理:对\(\foralla,b\)满足\((a,b)=1\),有\(a^{\varphi(b)}\equiv1\:(mod~b)\)证明:由简化剩余系的基本性质易得\(a_0a_1...a_{\varphi(m)-1}\equiv(aa_0)(aa_1)...(aa_{\varphi(m)-1})\(mod~m)\)推广:对\(\foralla,b,n\)有\(a^n\equiva^{n\:mod\:\varp......
  • # Windows 定时删除指定路径下N天前的日志文件
    Windows下bat脚本文件的内容为1.删除指定路径下5天前的所有文件@echooffsetSrcDir=E:\WORK\GitsetDaysAgo=5forfiles/p%SrcDir%/s/m*.*/d-%DaysAgo%/c"cmd/cdel/f/q/a@path"2.删除指定路径下5天前的所有log文件@echooffsetSrcDir=E:\WORK\Git//指......
  • 代码随想录算法训练营第16天|LeetCode112路径总和LeetCode113路径总和iiLeetCode106.
    代码随想录算法训练营Day16代码随想录算法训练营第16天|LeetCode112路径总和LeetCode113路径总和iiLeetCode106.从中序与后序遍历序列构造二叉树LeetCode105.从前序与中序遍历序列构造二叉树目录代码随想录算法训练营前言LeetCode112路径总和,LeetCode113路径......
  • 代码随想录算法训练营第 15 天 |LeetCode110平衡二叉树 LeetCode257二叉树的所有路径
    代码随想录算法训练营Day15代码随想录算法训练营第15天|LeetCode110平衡二叉树LeetCode257二叉树的所有路径LeetCode404左叶子之和LeetCode222完全二叉树节点之和目录代码随想录算法训练营前言LeetCode110平衡二叉树LeetCode257二叉树的所有路径LeetCode404左......
  • 欧拉角和万向节锁
    一个物体在空间中的姿态有很多种表达方式。欧拉证明三个正交的坐标轴可以用来表示任意姿态。定义,,分别为绕Z轴、Y轴、X轴的旋转角度,如果用Tait-Bryanangle表示,分别为Yaw、Pitch、Roll,即偏航角,俯仰角和横滚角。 欧拉角表示姿态变换,按照X-Y-Z三个轴依次旋转对应角度。在旋转过......
  • 实现Cesium中的第一视角漫游功能:路径设置、飞行、暂停、继续、退出与删除
    实现Cesium中的第一视角漫游功能:路径设置、飞行、暂停、继续、退出与删除在现代地理信息系统(GIS)应用中,三维地球浏览器如Cesium.js已经成为不可或缺的工具。今天,我们将深入探讨如何在Cesium中实现第一视角漫游功能,包括路径设置、飞行、暂停、继续、退出和删除路径。本文将通过详细......
  • 记录一次在欧拉(openEuler22.03LTS-SP4)系统下安装(踩坑)Freeswitch1.10.11的全过程
    目录前言安装环境1.下载Freeswitch1.1gitclone下载freeswitch库1.2官网下载2.开始安装前的工作2.1安装编译时需要的环境【先安装这个!】2.2configure前需要安装的库2.2.1.spandsp2.2.2.sofia-sip2.2.3.libks2.2.4.signalwire-c2.2.5x2642.2.6.libav2.2.6.1可能出现......
  • git如何使用分支b的某个文件夹替换main分支的相同路径
    在PyCharm中,如果你没有找到“Checkoutwith...”选项,可以使用以下方法从另一个分支提取特定文件夹或文件:方法1:使用“Git”工具窗口切换到main分支点击右下角的分支名称,选择main分支并切换。获取最新的更改在菜单中,选择VCS>UpdateProject...来确保你的main......
  • Google Colab 云端硬盘路径读取
    加载云端硬盘需要在左上角点击这个文件图标;fromgoogle.colabimportdrivedrive.mount("/content/drive")#挂载云端硬盘importospath="/content/drive/MyDrive/TextClassificationCustom"os.chdir(path)#以路径path作为当前工作目录os.listdir(path)curre......