Walking Around the Country 【OpenJ_POJ - C17E】【欧拉通路】

2023-11-03

题目链接


  题意:有N个点,M条边,给出“u v w”表示u到v要至少经过w次,并且整张图是完全连通图(有向图)。问的是最少的次数走完所有大额M条边。

  思路:由于\sum K \leq 3e5,所以我们完全可以当作只有\sum K条边,我们要跑完这\sum K条边,所以既然是跑完所有边的做法,那么不就是欧拉通路就可以做到了。比赛的时候利用了出度减入度的最大值出的方式利用了set来维护,TLE了,之后一直魔改,赛后补题。

  这里的话,原来给出的图或许是不构成欧拉通路的,一条欧拉通路,所以,我们想办法去构成欧拉通路。改变的方式依然跟出度和入度有关,当出度减去其入度大于0的时候,说明出的多,所以我们可以从它出去,当入度大于出度的时候,说明是进的多,那么,对于“出多入少”,我们利用超级源点0向它进行补充,使得出入相等,对于“出少入多”,我们也是利用超级源点0,让0被它所指向,就是该点进0。

  那么,经过这样的操作,我们就使得原图变成了几个环的形式,那么我们就先去把由超级源点构成的环先跑掉,然后再去把各自单独环再跑,那么不就是形成了各自的欧拉通路,我们就可以最优的解决上面的问题了。中间就是一些处理的操作了,因为我们可能会弹进0,所以我们需要再多开一点内存空间,避免RE。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e5 + 7, maxM = 6e6 + 7;
int N, M, head[maxN], cnt, du[maxN];    //du = out_du - in_du
struct Eddge
{
    int nex, to;
    Eddge(int a=-1, int b=0):nex(a), to(b) {}
}edge[maxM];
inline void addEddge(int u, int v)
{
    edge[cnt] = Eddge(head[u], v);
    head[u] = cnt++;
}
int Stap[maxM], Stop, ans[maxM], len;
bool vis[maxN];
void dfs(int u)
{
    vis[u] = true;
    for(int i=head[u], v; ~i; i=head[u])
    {
        v = edge[i].to; head[u] = edge[head[u]].nex;  //直接继承,因为有可能从后面会再次访问到它
        dfs(v);
    }
    Stap[++Stop] = u;
}
inline void init()
{
    cnt = Stop = len = 0;
    for(int i=0; i<=N; i++)
    {
        head[i] = -1;
        du[i] = 0; vis[i] = false;
    }
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &N, &M);
        init();
        for(int i=1, u, v, w; i<=M; i++)
        {
            scanf("%d%d%d", &u, &v, &w);
            du[u] += w; du[v] -= w;
            while(w--)
            {
                addEddge(u, v);
            }
        }
        for(int i=1; i<=N; i++) //build cricle
        {
            if(!du[i]) continue;
            if(du[i] > 0)
            {
                for(int j=1; j<=du[i]; j++) addEddge(0, i);
            }
            else
            {
                du[i] = -du[i];
                for(int j=1; j<=du[i]; j++) addEddge(i, 0);
            }
        }
        dfs(0);
        if(Stop > 2)    //未构成环的时候,我们搭建的环的时候
        {
            while(Stop)
            {
                if(Stap[Stop]) ans[++len] = Stap[Stop];
                Stop--;
            }
            if(!Stap[2]) --len;
        }
        for(int i=1; i<=N; i++)
        {
            if(vis[i]) continue;
            Stop = 0;
            dfs(i);
            if(Stop == 1) { Stop = 0; continue; }   //此时只有一个点,说明是没用的点
            while(Stop)
            {
                if(Stap[Stop]) ans[++len] = Stap[Stop];
                Stop--;
            }
            if(!Stap[2]) --len;
        }
        printf("%d\n", len - 1);
        for(int i=1; i<=len; i++) printf("%d%c", ans[i], i == len ? '\n' : ' ');
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Walking Around the Country 【OpenJ_POJ - C17E】【欧拉通路】 的相关文章

  • 数据结构 图 part2

    文章目录 图的遍历 深度优先遍历 DFS 遍历步骤 邻接矩阵的存储 邻接表的存储 广度优先遍历 BFS 遍历步骤 非连通图的遍历 连通分量 如何遍历 生成树 图的遍历 深度优先遍历 DFS 遍历步骤 在访问图中某一起始顶点v后 由v出发 访
  • 【构造】0617 Edge Split

    题意 给定一个 n n n 点 m m m 条边的无向连通图 其中 1
  • Supermarket 【POJ - 1456】【并查集+哈希表思想+贪心】

    题目链接 原来 并查集还有这样的作用 题记 我想用个哈希表的思维来解这道题 但是 显然O N 2 的哈希表去查询并插入显然是不行的 那么既然挂在图论专题 我就得用相应的方式解答咯 要是不挂在图论专题 我可能会自闭了 我们对于每个物品按照价值
  • [STL]vector常见用法详解

    目录 引入 常见用法介绍 1 vector的定义 2 vector容器内元素的访问 3 vector常用函数实例解析 1 push back 2 pop back 3 size 4 clear 5 insert 6 erase vector
  • 数据结构 图的应用

    文章目录 生成树 定义 性质 带权图的最小生成树 最小生成树的生成规则 最小生成树 Kruskal算法 步骤 最小生成树 Prim算法 步骤 最短路径 非负权值的单源最短路径 Dijkstra算法 目的 算法 存储空间 算法步骤 算法实现
  • 图论17(Leetcode864.获取所有钥匙的最短路径)

    用二进制表示获得的钥匙 假设n 钥匙个数 000000000代表没有钥匙 0000000001代表有idx为1的钥匙 0000000011代表有idx 1 2的钥匙 这方法巧妙又复杂 代码 class Solution static int
  • Codeforces-1454E Number of Simple Paths(基环树-思维)

    题目大意 给你n个点 n条边 求图中简单路径的个数 题目思路 n个点n条边 那么图中一定有一个环 拿这个图来讲 我们将两点间的关系分为4种 1 两点都在环上 简单路径的个数为2 例如2与5 2 一个点在环上一个点不在环上 简单路径个数为2
  • 2021级新生个人训练赛第38场

    问题 A chicken 题目描述 小 x 非常喜欢小鸡翅 他得知 NSC 超市为了吸引顾客 举行了如下的活动 一旦有顾客在其他超市找到更便宜的小鸡翅 NSC 超市将免费送给顾客 1000g 小鸡翅 小 x 为了尽可能的省钱 走遍了各大超市
  • 学懂最小生成树(克鲁斯卡尔算法)

    本节 小编将带大家了解最小生成树的第二种构成算法 克鲁斯卡尔算法 Kruskal algorithm 当然 对另一种算法感兴趣的朋友可以看看之前的这篇文章 学懂最小生成树 普里姆算法 目录 一 实现原理 二 代码实现 一 实现原理 克鲁斯卡
  • 【DFS和BFS习题集+分类总结】(更新至2023.1.1)(17788字)

    目录 第一题 八皇后 dfs 路径输出 前驱版 第一题的补充练习 N皇后 dfs 打表 第二题 自然数的拆分 第三题 图的遍历 BFS和DFS 第四题 fire net dfs 第五题 nightmare 可以走回头路的DFS 第六题 滑雪
  • The Stable Marriage Problem 【HDU - 1914】【稳定婚姻匹配问题】

    题目链接 Problem Description The stable marriage problem consists of matching members of two different sets according to the
  • 矩阵树定理

    启蒙 http zhengruioi com contest 1416 T1 T2的10分暴力 后面是论文科技 不搞了 https www luogu com cn problem P6178 O n 3
  • AcWing 378. 骑士放置(最大独立集&&匈牙利算法)

    输入样例 2 3 0 输出样例 4 解析 题意为求最大独立集 即为总点数 最小点覆盖 include
  • 《算法图解》读书笔记(二)

    第六章 图 广度优先搜索 1 解决最短路径问题 shortest path problem 的算法被称为广度优先搜索 breadth first search 2 图由节点 node 和边 edge 组成 一个节点可能与众多节点直接相连 这
  • Fix a Tree【Codeforces 699 D】【dfs + 树的性质】

    Codeforces Round 363 Div 2 D 题意 有N个点 每个点i都有一个父节点p i 如果 i p i 则是说明i结点是根结点 现在我们给出这样的1 N的p i 这可能是不合法的 问 我们应该最少改变多少个使它变成一棵合法
  • 蓝桥杯 题库 简单 每日十题 day2

    01 卡片 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 小蓝有很多数字卡片 每张卡片上都是数字 0 到 9 小蓝准备用这些卡片来拼一些数 他想从 1 开始拼出正整数 每拼一个 就保存起来 卡片就不能用来
  • 【算法笔记】Prim算法

    定义 prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 并且其所有边的权值之和最小 算法描述 输入 一个加权连通图 其中顶点集合为V 边集合为E 初始化 Vne
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • 第14届蓝桥杯C++B组省赛

    文章目录 A 日期统计 B 01 串的熵 C 冶炼金属 D 飞机降落 E 接龙数列 F 岛屿个数 G 子串简写 H 整数删除 I 景区导游 J 砍树 今年比去年难好多 Update 2023 4 10 反转了 炼金二分没写错 可以AC了 U
  • 860.染色法判定二分图

    二分图是指一个图中的所有顶点可以分为两部分 并且每条边连接的是属于不同部分的两个顶点 include

随机推荐

  • Java架构纯享版进阶手册:核心框架篇,斩获阿里年薪50W+

    在做管理的时候 我发现了很多同事职业发展的问题 很多同事都是积极好学 自己看了很多书 网上买了很多视频 也参加过不少培训课程 但是发现自己的技术始终在某个瓶颈徘徊 始终没法达到一个很高的位置 为什么呢 这里我援引大量同事给我的反馈 我是看了
  • 我们为什么要上学--奥巴马开学演讲稿

    美国总统奥巴马开学演讲 Why do We Go to School Hello everybody Thank you Thank you Thank you everybody All right everybody go ahead
  • BigDecimal转成String

    String total String map get total 结果就报了java math BigDecimal cannot be cast to java lang String异常 查询发现 问题是出在强转上 只要改成 Stri
  • JavaScript中字符串运算符的使用

    字符串运算符是用于两个字符串型数据之间的运算符 它的作用是将两个字符串连接起来 在JavaScript中 可以使用 和 运算符对两个字符串进行连接运算 其中 运算符用于连接两个字符串 而 运算符则连接两个字符串 并将结果赋给第一个字符串 另
  • 精选9款迷人的HTML5 3D动画效果及源码

    新的一周开始了 今天小编要为大家分享最新整理的9款HTML5 3D动画效果及源码下载 前端爱好者都可以来学习一下 以下就是详细的内容 一起来看看 1 HTML5 3D图片折叠特效 超炫酷图片特效 我们之前介绍过很多HTML5 3D图片效果
  • 神经网络之反向传播算法(梯度、误差反向传播算法BP)

    文章目录 一 反向传播及梯度 二 误差反向传播算法 BP 1 算法原理 2 算法实现 2 1 训练过程 2 2 测试过程及结果 3 参考源码及数据集 一 反向传播及梯度 在神经网络中 初始化生成的参数在使用时往往难以使网络获得最好的回归效果
  • 10讲学会C语言之第10讲:学生管理系统

    文章目录 前言 一 文件操作 二 系统介绍 三 作业 前言 大家好 我是卷卷 本节课是最后一讲 学生管理系统 本节课主要有以下三个部分 文件操作 系统介绍 作业 文末附课程资源和讨论q群号 一 文件操作 程序是在内存中运行的 一旦程序结束
  • wazauh离线部署

    官网 https wazuh com 如果服务器可以联网 直接参照官网文档部署即可 为方便安装 选择手动下载rpm包进行安装 wazuh相关下载地址 https documentation wazuh com 3 12 installati
  • Java课题笔记~ ServletContext

    单个Servlet的配置对象 web xml
  • vue-a-table表格前端实现多个条件搜索筛选功能实现(模糊查询)

    监听里面实现多条件查询
  • pip.conf的报错

    global index url https pypi tuna tsinghua edu cn simple extra index url http mirrors aliyun com pypi simple http pypi do
  • 软件测试面试题及答案,2021最强版!

    1 你的测试职业发展是什么 测试经验越多 测试能力越高 所以我的职业发展是需要时间积累的 一步步向着高级测试工程师奔去 而且我也有初步的职业规划 前3年积累测试经验 按如何做好测试工程师的要点去要求自己 不断更新自己改正自己 做好测试任务
  • JAVA1

    文章目录 计算机的硬件与软件 DOS命令 计算机的硬件与软件 DOS命令
  • 【硬创邦】跟hoowa学做智能路由(九):时区/服务/SSH

    在第三部分Area 3部分 路由器的基础功能已经讲了很多 这些部分组成了一款可用的路由器 本章将继续介绍余下的一些常用系统配置 系统信息和时区 我们大家知道电脑重新开机后时间都保留着 那是因为我们的主板上有电池和时间芯片 一般该芯片是达拉斯
  • 【Shell牛客刷题系列】SHELL29 netstat练习1-查看各个状态的连接数

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Shell 欢迎关注专栏 本文知识预告 本文复习了sort awk uniq grep等命
  • css 单行文字多余部分显示省略号

    css 单行文字多余部分显示省略号 如下图 当文字太多超出一行时不好看了 设置一下只显示一行 多余部分显示省略号 overflow hidden text overflow ellipsis 禁止换行显示 white space nowra
  • Docker安装Kafka教程

    Docker安装Kafka教程 本教程将指导您如何使用Docker安装和运行Kafka app tier 网络名称 driver 网络类型为bridge docker network create app tier driver bridg
  • 记一位大三计算机同学的2021春招

    知乎传送门 楚留香 你的2022届暑期实习怎么样了 摘要 均为算法岗 MSRA 商汤研究院 百度商业研究院 阿里支付宝算法 腾讯安全联邦学习 美团某toB团队算法 字节AI Lab CV算法 腾讯AI Lab 研究
  • 图片压缩网站-免费压缩网站

    https tinypng com 图片压缩网站 重点是免费 免费 免费 重要的事情说3遍
  • Walking Around the Country 【OpenJ_POJ - C17E】【欧拉通路】

    题目链接 题意 有N个点 M条边 给出 u v w 表示u到v要至少经过w次 并且整张图是完全连通图 有向图 问的是最少的次数走完所有大额M条边 思路 由于 所以我们完全可以当作只有条边 我们要跑完这条边 所以既然是跑完所有边的做法 那么不