hdu6311 Cover (欧拉路径输出)
hdu6311Cover
题意:有最少用多少条边不重复的路径可以覆盖一个张无向图。
分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1} 条路径。将奇度数的点两两相连边(虚边),然后先从奇度数的点出发,搜索由其出发的欧拉回路。需要将遍历的边和其反向边打标记,并在DFS退栈的时候记录边的编号(前向星的存储是访问后加入的边),若该边是自己添加的虚边,那么说明实际上这次DFS搜索到的是一条欧拉通路,那么结果还需额外+1,所以对所有奇数点DFS过后,得到的结果就是max{k/2,1}。
再从未被访问过的偶数顶点出发搜索由其出发的欧拉回路,每一次DFS就是找到了一条回路。
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define LL long long
#define mem(i,j) memset(i,j,sizeof(i))
using namespace std;
const int N=1e5+;
int n, m;
struct EDGE {
int to,nt; int id; bool f;
}E[N<<];
int head[N], tot;
void addE(int u,int v,int id) {
E[tot].f=; E[tot].to=v;
E[tot].id=id; E[tot].nt=head[u];
head[u]=tot++;
}
bool vis[N];
int deg[N], cnt;
vector <int> ans[N];
void init() {
tot=cnt=; mem(head,-);
mem(deg,); mem(vis,);
} void dfs(int u) {
vis[u]=;
for(int i=head[u];~i;i=E[i].nt) {
int v=E[i].to, id=E[i].id;
if(!E[i].f) {
E[i].f=E[i^].f=; // 这条边和对应的反向边标记
dfs(v); // 一直搜到终点
if(id) ans[cnt].push_back(-id); // 从终点开始反向记录路径 所以是-id
else cnt++; // id为0说明遇到了手动加的边 就是新的一笔
}
}
} int main()
{
while(~scanf("%d%d",&n,&m)) {
init();
for(int i=;i<=m;i++) {
int u,v; scanf("%d%d",&u,&v);
deg[u]++, deg[v]++;
addE(u,v,i); addE(v,u,-i);
} int u=;
for(int i=;i<=n;i++)
if(deg[i]&) { // 奇数度的点 两两连边
if(u) addE(u,i,), addE(i,u,), u=;
else u=i;
} for(int i=;i<=n;i++)
if(!vis[i] && (deg[i]&)) { /// 先从奇数点开始搜
cnt++; dfs(i); cnt--; // cnt记录的是之前的最后一条路
}
// 所以记录新的路应该cnt++先移到下一条路
// 搜索过程中一直cnt++所以搜索结束后cnt是在下一条路
// 此时将cnt置为最后一条路 应该cnt--
for(int i=;i<=n;i++)
if(!vis[i] && deg[i]) {
cnt++; dfs(i);
} // 此时还未走过的点都是偶数点 形成一个环 所以不需要cnt-- printf("%d\n",cnt);
for(int i=;i<=cnt;i++) {
int len=ans[i].size();
printf("%d",len);
for(int j=;j<len;j++)
printf(" %d",ans[i][j]);
printf("\n"); ans[i].clear();
}
} return ;
}
来自博客:https://www.cnblogs.com/xiuwenli/p/9372062.html
hdu6311 Cover (欧拉路径输出)的更多相关文章
- HDU6311 Cover (欧拉路径->无向图有最少用多少条边不重复的路径可以覆盖一个张无向图)
题意:有最少用多少条边不重复的路径可以覆盖一个张无向图 ,输出每条路径的边的序号 , 如果是反向就输出-id. 也就是可以多少次一笔画的方式画完这个无向图. 题解:我们已知最优胜的情况是整个图是欧拉图 ...
- HDU6311 Cover【欧拉路径 | 回路】
HDU6311 Cover 题意: 给出\(N\)个点的简单无向图,不一定联通,现在要用最少的路径去覆盖所有边,并且每条边只被覆盖一次,问最少路径覆盖数和各条路径 \(N\le 10^5\) 题解: ...
- HDU - 6311 Cover (欧拉路径)
题意:有最少用多少条边不重复的路径可以覆盖一个张无向图. 分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1} 条路径.将奇度数的点两两相连边(虚边),然后先 ...
- POJ 2337 输出欧拉路径
太无语了. 这道题做了一整天. 主要还是我太弱了. 以后这个就当输出欧拉路径的模版吧. 题目中的输出字典序最小我有点搞不清楚,看了别人是这么写的.但是我发现我过不了后面DISCUSS里面的数据. 题意 ...
- POJ2337 欧拉路径字典序输出
题意: 给一些单词,问是否可以每个单词只用一次,然后连接在一起(不一定要成环,能连接在一起就行). 思路: 这个题目的入手点比较好想,其实就是问欧拉路径,先说下解题步骤,然后在 ...
- 小巧玲珑:机器学习届快刀XGBoost的介绍和使用
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:张萌 序言 XGBoost效率很高,在Kaggle等诸多比赛中使用广泛,并且取得了不少好成绩.为了让公司的算法工程师,可以更加方便的 ...
- golang在gitlab中的工作流
在敏捷开发的时代, 快速的编码, code review, 测试, 部署, 是提升程序员效率的关键. 同时在基础工具完备的如今, 我们甚至无需过多的操作就可以轻松实现上述步骤, 本文就以gitlab为 ...
- UVA 10735 Euler Circuit (最大流)
题意:求混合图的欧拉路径. 一句话总结:网络流,最主要在于建图,此题是将出度则是和流量联系在了一起,用最大流来调整边的指向. 分析: 这题的困难之处在于无向边只能用一次,相当于一个方向未定的有向边. ...
- golang 单元测试&&性能测试
一:单元测试 1.为什么要做单元测试和性能测试 减少bug 快速定位bug 减少调试时间 提高代码质量 2.golang的单元测试 单元测试代码的go文件必须以_test.go结尾 单元测试的函数名必 ...
随机推荐
- day01-html
HTML概述: HTML: Hyper Text Markup Language 超文本标记语言 超文本: 比普通文本功能更加强大,可以添加各种样式 标记语言: 通过一组标签.来对内容进行描述. &l ...
- linux安装 inotify
[root@rsync-client-inotify ~]# yum install make gcc gcc-c++ [root@rsync-client-inotify ~]# wget http ...
- Nginx安装与配置-Centos7
Nginx是一款高性能免费开源网页服务器,也可用于反向代理和负载均衡服务器.该软件由伊戈尔·赛索耶夫于2004年发布,2019年3月11日,Nginx被F5 Networks以6.7亿美元收购.201 ...
- sort 文本排序
1.命令功能 sort 将输入的文件内容按照指定的规则排序,然后将排序的内容输出. 2. 语法格式 sort option file 参数说明 参数 参数说明 -b 忽略每行开头的空格 -n 根据 ...
- eclipse的代码格式化的个性配置
1.安装jdk a. 到http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载对应版本的jdk,安装到自己电脑上. ...
- 网络安全专家教你设置史上最安全的WiFi密码
通过设置强密码可以防止WiFi被蹭网现象的发生,保证WiFi网络安全.那么我们的WiFi密码怎么设置才最安全呢? 提供以下设置建议: 1.WiFi密码设置尽量使用字母.数字和字符组成的密码.这种密码强 ...
- LeetCode--041--缺失的第一个整数(java)
给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11 ...
- 小陈现有2个任务A,B要完成,每个任务分别有若干步骤如下 一道网上没啥题解的难题(至少我是这么觉得的)
小陈现有2个任务A,B要完成,每个任务分别有若干步骤如下:A=a1->a2->a3,B=b1->b2->b3->b4->b5.在任何时候,小陈只能专心做某个任务的一 ...
- GIS矢量大数据采集
1.使用什么工具采集 2.在哪个网站采集 3.采集哪一种数据 >>地理大数据公众号 >>大数据公众号 >>智能数据湖公众号 点.线.面.体 可视化 >> ...
- [CSP-S模拟测试]:Park(树上DP)
题目描述 公园里有$n$个雕像,有$n-1$条道路分别连接其中两个雕像,任意两个雕像可以直接或间接相连.现在每个景点$i$聚集着$P_i$只鸽子,旅行家手里有$v$数量的面包屑. 一旦旅行家在雕像$i ...