图论(欧拉路径)

理论:

所有边都经过一次,若欧拉路径,起点终点相同,欧拉回路
有向图欧拉路径:恰好一个out=in+1,一个in=out+1,其余in=out
有向图欧拉回路:所有in=out
无向图欧拉路径:两个点度数奇,其余偶
无向图欧拉回路:全偶

基础练习

P7771 【模板】欧拉路径
P2731 [USACO3.3] 骑马修栅栏 Riding the Fences
P1341 无序字母对

进阶

P3520 [POI2011] SMI-Garbage
题意:n点m条边以及边的目前状态目标状态,若干辆垃圾车跑欧拉回路,每次垃圾车经过改变路的状态
给出需要跑多少次欧拉回路和每次欧拉回路的路径才能所有边实现目标
思路:无向图欧拉回路拆环,
欧拉回路边只经过一次,于是当前状态与目标状态相同的边不用管
变成ol回路拆环问题,考虑在入栈的时候检查该元素是否在栈中,若在,表示成环。
由于常见的求欧拉路的程序给出的结尾都不是开头点,所以在dfs调用后栈里面还剩下一个环,输出即可。

#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<math.h>
#include<map>
#include<vector>
#include<stack>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define ms(x,y) memset(x,y,sizeof x);
#define YES cout<<"YES"<<'\n';
#define NO  cout<<"NO"<<'\n';
#define fr(i,z,n) for(int i = z;i <= n; i++)
#define ufr(i,n,z) for(int i = n;i >= z; i--)
#define fer(i,x)   for(int i=e.head[x];~i;i=e.next[i])
typedef long long ll;
const ll N= 1e6  + 10, inf = 1e18;
const ll mod = 1e9 + 7;
using namespace std;int n, m;
int vist[N];            //标记点
int vis[N<<1];                     //标记边
int deg[N],instack[N];
int tot;
stack<int>sta;
vector<int>va[N];
template<size_t size>
struct Road {int to[size<<1], next[size<<1], head[size<<1], cnt = 1;ll w[size<<1];void add(int x, int y, ll ww) {to[cnt] = y;w[cnt] = ww;next[cnt] = head[x];head[x] = cnt++;}void clear(int n) {for (int i = 0; i <= n; i++) {head[i] = -1;}cnt = 0;}};
Road <N> e; // 无向图 * 2
void dfs(int x) {vist[x] = 1;fer(i, x) {int v = e.to[i];if (!vis[i]) {        //边未标记,每条无向边只能走一次vis[i] = vis[i ^ 1] = 1;             //两条有向边组成无向边e.head[x] = e.next[i];       //下一次直接从nex[i]开始,降低时间复杂度dfs(v);if (instack[v]) {    va[tot].push_back(v);while (sta.top()!=v) {va[tot].push_back(sta.top());instack[sta.top()] = 0;sta.pop();}va[tot].push_back(v);tot++;}else {sta.push(v);//cout << v << '\n';instack[v] = 1;}}}
}
void solve() {scanf("%d %d", &n, &m);e.clear(n);fr(i, 1, m) {int x, y, f, t;scanf("%d %d %d %d", &x, &y, &f, &t);if (f ^ t) {      //相异,需要经过     e.add(x, y, 0);e.add(y, x, 0);deg[x]++;deg[y]++;}}int flag = 0;fr(i, 1, n) {if (deg[i] % 2) {           //无向图的欧拉回路应该为全偶flag = 1;break;}}if (flag) {printf("NIE\n");return;}fr(i, 1, n) {if (!vist[i]) {               //点未标记dfs(i);if (instack[i]) {    //多个环以i为起点,剩余最后一个环va[tot].push_back(i);while (!sta.empty()) {va[tot].push_back(sta.top());instack[sta.top()] = 0;sta.pop();}tot++;}}}printf("%d\n", tot);for (int i = 0; i < tot; i++) {printf("%d ", va[i].size()-1);for (auto it : va[i]) {printf("%d ", it);}printf("\n");}
}signed main()
{ios;int t = 1;//cin >> t;while (t--) {solve();}
}

P3443 [POI2006] LIS-The Postman
题意:给定一个有向图,规定路线从1开始1结束,经过每条边恰好一次,同时给定一些序列
序列在路线中需要连续出现,求满足的路线
x,y<=n<=5e4,m<=2e5
思路:难点在于序列的合并
序列顺序要有边,同时序列的前驱和后继只能有一个,用E存边
 用pre,Next记录序列点的前驱后继在E的位置
重新建图(将序列合并),跑欧拉回路,stack入栈起点在在E的位置
最后还要确定每条边都用上

#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<cstring>
#include<math.h>
#include<map>
#include<vector>
#include<stack>
#define endl '\n'
#define ios ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define ms(x,y) memset(x,y,sizeof x);
#define YES cout<<"YES"<<'\n';
#define NO  cout<<"NO"<<'\n';
#define fr(i,z,n) for(int i = z;i <= n; i++)
#define ufr(i,n,z) for(int i = n;i >= z; i--)
#define fer(i,x)   for(int i=e.head[x];i;i=e.next[i])
typedef long long ll;
const ll N = 1e6 + 10, inf = 1e18;
const ll mod = 1e9 + 7;
using namespace std;int in[N];
template<size_t size>
struct Road {int to[size], next[size], head[size], cnt = 1;ll w[size];void add(int x, int y, ll ww) {to[cnt] = y;w[cnt] = ww;next[cnt] = head[x];head[x] = cnt++;}void clear(int n) {for (int i = 0; i <= n; i++) {head[i] = 0;}cnt = 1;}
};
Road<N>e;
int n, m;
map<int, int>H[N];
pair<int, int>E[N];
int pre[N], Next[N], b[N],vis[N];
stack<int>sta;
bool ans = 0;
void dfs(int x) {fer(i, x) {int v = e.to[i];if (!vis[i]) {vis[i] = 1;e.head[x] = e.next[i];dfs(v);sta.push(e.w[i]);           //入栈起点在E的位置}}
}
void solve() {cin >> n >> m;fr(i, 1, m) {int x, y;cin >> x >> y;E[i] = make_pair(x, y);     //记录边H[x][y] = i;    //记录边在E位置      in[y]++;in[x]--;}fr(i, 1, n) {if (in[i]) {        //有向图的欧拉路径in==outans = 1;}}int k;cin >> k;fr(i, 1, k) {             int cnt,last;cin >> cnt;cin >> last;for (int j = 1; j < cnt; j++) {int y;cin >> y;if (H[last].find(y) == H[last].end()) {    //没有last->y的边ans = 1;}b[j] = H[last][y];last = y;}for (int j = 2; j < cnt;j++) {    //处理前驱后继以及边的合并if (!pre[b[j]]) {pre[b[j]] = b[j - 1];}else if (pre[b[j]] != b[j - 1]) {    //因为每条边只能出现一次ans = 1;}if (!Next[b[j-1]]) {Next[b[j - 1]] = b[j];}else if(Next[b[j-1]]!=b[j]) {ans = 1;}}}if (ans == 1) {cout << "NIE" << '\n';return;}int c = 0;fr(i, 1, m) {                  //建图if (!pre[i]) {++c;int j;for (j = i; Next[j]; j = Next[j]) c++;e.add(E[i].first, E[j].second, i);        //i记录起点在E的位置}}if (c < m || !e.head[1]) {     //判断联通(c==m)和能否从1开始cout << "NIE" << '\n';return;}fr(i, 1, n) {             //建图后需要再判断if (in[i]) {cout << "NIE" << '\n';return;}}dfs(1);           //欧拉回路fr(i, 1, n) {                           if (e.head[i]) {                 //确定每条边都用上cout << "NIE" << '\n';return;}}cout << "TAK" << '\n';cout << 1 <<'\n';while (!sta.empty()) {int j = sta.top();sta.pop();while (j) {cout << E[j].second << '\n';j = Next[j];}}
}signed main()
{ios;int t = 1;//cin >> t;while (t--) {solve();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/133333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.4、Linux小程序:进度条

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 回车与换行的概念和区别 行缓冲区概念 进度条代码 version1 version2 version3 回车与换行的概念和区别 换行\n&#xff0c;回车\r 似乎无需多言 行缓冲区概念 这里我们通过例子来简单理解即可&#xff0c;深入…

vue面试题

Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;被设计用来构建用户界面。与其他重量级框架&#xff08;如 Angular 或 React&#xff09;相比&#xff0c;Vue.js 提供了更简单、更灵活的 API&#xff0c;使得你可以在各种项目中灵活使用。 Vue.js 主要的核心特性是&#…

wx 小程序不打开调试模式无法获取数据

问题开始 最近学习小程序&#xff0c;发布了一个体验版的小程序&#xff0c;发现正常扫码进入后接口数据是无法访问的。也就是原始数据,不过开启调试模式后,数据又一切正常&#xff0c;但是总不能让每个人都开启调试模式用吧&#xff0c;终于查阅资料后找到了解决问题的办法 …

10 索引优化与查询优化

文章目录 索引失效案例关联查询优化对于左外连接对于内连接JOIN语句原理简单嵌套循环连接SNLJ索引嵌套循环连接INLJ块嵌套循环连接BNLJHash Join 子查询优化排序优化filesort算法&#xff1a;双路排序和单路排序 分组优化分页优化优先考虑覆盖索引索引下推ICP使用条件 其他查询…

最新、最全、最详细的 K8S 学习笔记总结

Kubernetes就是一个编排容器的工具&#xff0c;一个可以管理应用全生命周期的工具&#xff0c;从创建应用&#xff0c;应用的部署&#xff0c;应用提供服务&#xff0c;扩容缩容应用&#xff0c;应用更新&#xff0c;都非常的方便&#xff0c;而且可以做到故障自愈。 K8S的前景…

笔记50:正则表达式入门宝典

引自&#xff1a;正则表达式是什么? - 知乎 中“龙吟九野”所写的一个回答&#xff0c;个人感觉看完之后如同醍醐灌顶&#xff0c;查了很多资料都没有这篇文章写的基础和通透&#xff0c;感觉是正则表达式扫盲好文&#xff0c;所以搬运一下&#xff0c;侵权删&#xff0c;感谢…

面向萌新的数学建模入门指南

时间飞逝&#xff0c;我的大一建模生涯也告一段落。感谢建模路上帮助过我的学长和学姐们&#xff0c;滴水之恩当涌泉相报&#xff0c;写下这篇感想&#xff0c;希望可以给学弟学妹们一丝启发&#xff0c;也就完成我的想法了。拙劣的文笔&#xff0c;也不知道写些啥&#xff0c;…

ESP8266:物联网时代的连接神器

一、引言 在当今的物联网时代&#xff0c;智能设备与互联网的连接已经成为日常生活中不可或缺的一部分。而在这股浪潮中&#xff0c;ESP8266作为一个低成本、高效率的Wi-Fi芯片模块&#xff0c;扮演着举足轻重的角色。本文将为你揭示ESP8266的魅力&#xff0c;并探讨其在物联网…

Hadoop知识点全面总结

文章目录 什么是HadoopHadoop发行版介绍Hadoop版本演变历史Hadoop3.x的细节优化Hadoop三大核心组件介绍HDFS体系结构NameNode介绍总结 SecondaryNameNode介绍DataNode介绍DataNode总结 MapReduce介绍分布式计算介绍MapReduce原理剖析MapReduce之Map阶段MapReduce之Reduce阶段 实…

MySQL的event的使用方法

MySQL的event的使用方法 一、事件定时策略 1、查看event事件开启状态 SHOW VARIABLES LIKE event_scheduler;如图&#xff0c;Value值 ON&#xff1a;打开&#xff0c;OFF&#xff1a;关闭。 2、设置event事件打开 SET GLOBAL event_scheduler ON;如果MySQL重启了&#x…

【软件工程】金管局计算机岗位——软件测试的分类(⭐⭐⭐⭐)

软件工程 软件测试的分类从是否关心软件内部结构和具体实现的角度划&#xff08;⭐⭐⭐⭐&#xff09;从是否执行代码角度划分&#xff08;⭐⭐&#xff09;从软件开发的过程按阶段划分&#xff08;⭐⭐⭐⭐&#xff09; 软件测试的分类 考点导读&#xff1a; 软件测试是软件工…

C#通过FTP与异构系统实现业务接口

using System; using System.Data; using System.Configuration; using System.Web; using System.Net; using System.IO; using System.Text; using System.Configuration; /// <summary> /// FtpWeb 的摘要说明 /// .net对FTP操作类 /// </summary> namespace…

vSLAM中IMU预积分的作用--以惯性导航的角度分析

作为一个学过一点惯导的工程师&#xff0c;在初次接触视觉slam方向时&#xff0c;最感兴趣的就是IMU预积分了。但为什么要用这个预积分&#xff0c;在看了很多材料和书后&#xff0c;还是感觉模模糊糊&#xff0c;云里雾里。 在接触了vSLAM的更多内容后&#xff0c;站在历史研究…

极简web集成 rtsp/rtmp免插件播放,web rtsp/rtmp推流方案

一直有客户要求在Web上集成rtsp/rtmp播放和web推流功能,测试对比各种流服务平台和播放器后&#xff0c;发现在github的ovsyunlive不管是延时&#xff0c;便捷和集成易用性都是非常好&#xff0c;还是看效果吧&#xff0c;直接下载测试如下&#xff1a; github 搜ovsyunlive下载…

STM32 IAP应用开发--bootloader升级程序

STM32 IAP应用开发--bootloader升级程序 Chapter1 STM32 IAP应用开发——通过串口/RS485实现固件升级&#xff08;方式2&#xff09;前言什么是IAP&#xff1f;什么是BootLoader&#xff1f; 方案介绍&#xff1a;1&#xff09;bootloader部分&#xff1a;2&#xff09;APP部分…

Health Kit申请验证有问题?解决方案全解析

在接入Health Kit的过程中&#xff0c;应用上线前需要完成申请验证环节&#xff0c;获得正式的运动健康权限。 我们贴心整理了申请验证被驳回的高频问题&#xff0c;您可以在申请前阅读以下内容&#xff0c;避免在您的申请材料中出现下述问题影响审核通过的进度哦&#xff01;…

纷享销客获评中小企业数字化转型优质服务商

近日&#xff0c;纷享销客成功入选长沙市工信局评定的【中小企业数字化转型优质服务商】&#xff0c;专业服务实力得到官方认可&#xff01; 今年6月&#xff0c;财政部、工信部联合印发《关于开展中小企业数字化转型城市试点工作的通知》&#xff0c;长沙市成功入选首批中小企…

程序员笔记本电脑选 windows 还是 MAC

计算机选择是每个进入 IT 行业同学的第一个重要选择&#xff0c;那么你是怎么选择的呢&#xff1f; 选择操作系统&#xff08;Windows还是macOS&#xff09;取决于程序员的需求、偏好和工作流程。每个操作系统都有其优点和缺点&#xff0c;下面将分别讨论它们&#xff0c;以帮助…

RK3568驱动指南|第七篇 设备树-第61章 实例分析:pinctrl

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…