CCF-CSP题解 201512-4 送货
2024-09-01 19:59:02
求字典序最小欧拉路。
似乎不能用\(Fluery\)算法(\(O(E^2)\))。\(Fluery\)算法的思路是:延申的边尽可能不是除去已走过边的图的桥(割)。每走一步都要判断是否是割,应当会超时。
采用\(Hierholzer\)算法(\(O(V+E)\)),亦称逐步插入回路法。思路见代码。注意根据题意,每次选取未走过顶点最小的边延申。
注意题目要求从1号节点出发。
欧拉路存在的条件:
无向图:
存在欧拉回路的条件:原图连通,每个节点均为偶度节点。
存在欧拉通路的条件:存在欧拉回路,或原图连通,有两个节点为奇度节点,其他节点均为偶度节点。
有向图:
存在欧拉回路的条件:基图(有向边变成无向边)连通,每个节点的入度等于出度。
存在欧拉通路的条件:存在欧拉回路,或基图连通,有一个节点入度等于出度+1,有一个节点出度等于入度+1,其他节点入度等于出度。
#include<bits/stdc++.h>
const int maxn = 10000;
const int maxm = 100000;
using namespace std;
int to[maxm * 2 + 10];
int vis[maxm * 2 + 10];
int nex[maxm * 2 + 10];
int head[maxn + 10], cnt = 0;
void addEdge(int a, int b)
{
to[cnt] = b;
vis[cnt] = 0;
nex[cnt] = head[a];
head[a] = cnt++;
to[cnt] = a;
vis[cnt] = 0;
nex[cnt] = head[b];
head[b] = cnt++;
}
int degree[maxn + 10];
int vis1[maxn + 10], num = 0;
void dfs(int x)
{
vis1[x] = 1;
num++;
for (int i = head[x]; i != -1; i = nex[i])
{
int l = to[i];
if (!vis1[l])
dfs(l);
}
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
memset(head, -1, sizeof(head));
memset(degree, 0, sizeof(degree));
for (int i = 1, a, b; i <= m; i++)
{
scanf("%d%d", &a, &b);
addEdge(a, b);
degree[a]++;
degree[b]++;
}
memset(vis1, 0, sizeof(vis1));
dfs(1);
int odd = 0;
for (int i = 1; i <= n; i++)
{
if (degree[i] % 2)
odd++;
}
if (num == n && (odd == 0 || (odd == 2 && degree[1] % 2)))
{
stack<int> s1, s2;
s1.push(1);
while (!s1.empty())
{
int x = s1.top();
int y = -1, ii = -1;
for (int i = head[x]; i != -1; i = nex[i])
{
if (vis[i])
continue;
int l = to[i];
if (y == -1 || y > l)
y = l, ii = i;
}
if (y == -1)
{
s2.push(x);
s1.pop();
}
else
{
vis[ii] = vis[ii ^ 1] = 1;
s1.push(y);
}
}
bool first = true;
while (!s2.empty())
{
if (first)
{
printf("%d", s2.top());
s2.pop();
first = false;
}
else
{
printf(" %d", s2.top());
s2.pop();
}
}
printf("\n");
}
else
{
printf("-1\n");
}
return 0;
}
最新文章
- div+css:div中图片垂直居中
- java.lang.NoSuchMethodError:
- 保证唯一的一种js提交数据方式,还不错
- python之面向对象编程
- yii2框架增删改查案例
- Web.config自定义节点configSections
- Objective -C学习笔记 之copy(复制)
- 【编程题目】一串首尾相连的珠子(m 个),有 N 种颜色(N<;=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短。
- EF &ndash; 4.CRUD与事务
- ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
- 免费馅饼 Why WA
- X61的intel wireless 3945abg 不再掉线了
- Javascript 基础知识笔记
- jquery 浏览器放大缩小函数resize
- Java中的局部变量表及使用jclasslib进行查看
- [bzoj2574] [Poi1999]Store-Keeper
- 详谈C++虚函数表那回事(多重继承关系)
- 简单的 FastDFS + Nginx 应用实例
- (4.3)mysql备份还原——mysql备份策略
- java利用Comparator接口对自定义数组排序
热门文章
- Java数组使用以及foreach循环
- linux进程管理常用命令
- Selenium+Java(六)Selenium 强制等待、显式等待、隐实等待
- kafka官方的kafka-server-start.sh不能关闭kafka进程解决办法
- Identityserver4中ResourceOwnerPassword 模式获取refreshtoken
- SpringMVC 前端传递list到后台
- python实现一可升降式的冒泡排序
- 程序员的算法课(16)-B+树在数据库索引中的作用
- CMSdede后台登陆界面设计
- 以面向对象的思维,搭建Android与多ble蓝牙设备并发通讯小框架