HDU6311 Cover (欧拉路径->无向图有最少用多少条边不重复的路径可以覆盖一个张无向图)
题意:有最少用多少条边不重复的路径可以覆盖一个张无向图 ,输出每条路径的边的序号 , 如果是反向就输出-id。
也就是可以多少次一笔画的方式画完这个无向图。
题解:我们已知最优胜的情况是整个图是欧拉图的时候 ,我们只需要一笔就搞定了 , 可是现在这个图并不是一个欧拉图, 所以现在问题是其转化为欧拉图 ,那我们根据欧拉图的性质 , 如果一个无向图是欧拉图的时候当且这个图有奇数的度的点有0个或者是2个 , 而且如果是两个的话那这两个点肯定是起点或者终点 ; 所以现在我们就遍历整个图的奇数点将其连接成为一个欧拉图 , 然后跑一遍求欧拉路径的算法 ,如果遇到的是我们构造出的虚拟边 , 是不是就是意味着这里是一个断点 ,需要我们重新起笔在画;
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll ;
const int maxn = 1e5+;
struct Edge
{
int to,id,next;
bool f;
}edges[maxn<<];
int fa=;
int tot , head[maxn] , cnt;
bool vis[maxn];
vector<int> res[maxn];
int deg[maxn];
void init()
{
tot = ;
cnt = ;
memset(deg,,sizeof(deg));
memset(vis,,sizeof(vis));
memset(head,-,sizeof(head));
}
void AddEdge(int u , int v , int id)
{
edges[tot].f=; edges[tot].to = v ; edges[tot].id=id;
edges[tot].next = head[u] ; head[u] = tot++;
} void dfs(int u)
{
vis[u]=true;
for(int i=head[u] ; ~i ; i=edges[i].next)
{
int v=edges[i].to , id =edges[i].id;
if(!edges[i].f)
{
edges[i].f = edges[i^].f=true; //将边和反向边标记
dfs(v);
if(id) res[cnt].push_back(-id); ///退丈记录边id
else cnt++; ///扫到虚边,那么路径加1
}
}
}
void Print()
{
printf("%d\n",cnt);
for(int i= ; i<=cnt ; i++)
{
printf("%d",res[i].size());
for(int j= ; j<res[i].size() ; ++j)
printf(" %d",res[i][j]);
puts("");
res[i].clear();
}
}
int main()
{
int T,N,M,u,v,tmp;
while(~scanf("%d%d",&N,&M))
{
init();
for(int i= ; i<=M ; i++)
{
scanf("%d%d",&u,&v);
deg[u]++ , deg[v]++;
AddEdge(u,v,i);
AddEdge(v,u,-i);
}
///将图的奇数的度连起
u=;
for(int i= ; i<=N ; i++)
{
if(deg[i]&)
{
if(u)
{
AddEdge(u,i,);
AddEdge(i,u,);
u=;
}
else u=i;
}
} for(int i= ; i<=N ; i++)
{
if(!vis[i] && (deg[i]&))
{
cnt++; ///细节处理cnt , 如果出现虚边cnt++ , 下次dfs()还cnt++ , 这是不对的
dfs(i);
cnt--;
}
}
for(int i= ; i<=N ; i++)
{
if(!vis[i] && deg[i])
{
cnt++; ///偶数的点不会出现虚遍
dfs(i); }
}
Print();
}
return ;
}
HDU6311 Cover (欧拉路径->无向图有最少用多少条边不重复的路径可以覆盖一个张无向图)的更多相关文章
- hdu6311 Cover (欧拉路径输出)
hdu6311Cover 题目传送门 题意:有最少用多少条边不重复的路径可以覆盖一个张无向图. 分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1} 条路径. ...
- HDU - 6311 Cover (欧拉路径)
题意:有最少用多少条边不重复的路径可以覆盖一个张无向图. 分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1} 条路径.将奇度数的点两两相连边(虚边),然后先 ...
- HDU6311 Cover【欧拉路径 | 回路】
HDU6311 Cover 题意: 给出\(N\)个点的简单无向图,不一定联通,现在要用最少的路径去覆盖所有边,并且每条边只被覆盖一次,问最少路径覆盖数和各条路径 \(N\le 10^5\) 题解: ...
- poj 1236 Network of Schools【强连通求孤立强连通分支个数&&最少加多少条边使其成为强连通图】
Network of Schools Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 13800 Accepted: 55 ...
- poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10141 Accepted: 503 ...
- poj 3177 Redundant Paths【求最少添加多少条边可以使图变成双连通图】【缩点后求入度为1的点个数】
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11047 Accepted: 4725 ...
- Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
无向连通图最少包含多少条边 题目 问题描述 一个包含有2019个结点的无向连通图,最少包含多少条边? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填 ...
- HDU - 6311 Cover(无向图的最少路径边覆盖 欧拉路径)
题意 给个无向图,无重边和自环,问最少需要多少路径把边覆盖了.并输出相应路径 分析 首先联通块之间是独立的,对于一个联通块内,最少路径覆盖就是 max(1,度数为奇数点的个数/2).然后就是求欧拉路 ...
- HDU - 6311:Cover(欧拉回路,最少的一笔画覆盖无向图)
The Wall has down and the King in the north has to send his soldiers to sentinel. The North can be r ...
随机推荐
- GROUP BY ROLLUP和CUBE 用法
ROLLUP和CUBE 用法 Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句. 如果是Group by ROLLUP(A, B, C)的话 ...
- 62-U型数字
https://nanti.jisuanke.com/t/20683 #include <iostream> using namespace std; int main(){ int ct ...
- Python 安装selenium
一.报错信息 No module named 'selenium' 二.系统环境 操作系统:Win10 64位 Python版本:Python 3.7.0 三.安装参考 1.使用pip安装seleni ...
- LINUX 查看CUP温度
在Linux下可以通过lm_sensors来查看CPU的温度(当然你的硬件首先要支持),要使用这个功能要有内核相关模块(比如I2C)的支持,下面说一下操作方法: 先看一下你的机器上是否安装了lm_se ...
- cmake的一些词的解释
cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录 PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR} ...
- wpf path语法
http://www.cnblogs.com/HQFZ/p/4452548.html WPF系列 Path表示语法详解(Path之Data属性语法)
- jQuery高级
一.动画效果 常用的几种效果都是没有easing参数的,也即动画只能swing.$(selector).animate(styles,speed,easing,callback)中是有easing参数 ...
- DELPHI 调用系统 ADO 配置窗体 提高软件易用性
最近DELPHI好像不太景气哦,把自己的代码拿出来晒晒.高手别喷哦. 直接上代码 implementation uses AdoConEd; var saveconnstr:string; proc ...
- 【学习】CodeUi
关于这个,博客园里有很多初级的教程,我是看这篇: http://www.cnblogs.com/luminji/archive/2010/11/18/1880452.html 初学的可以跟着这个做一边 ...
- Activity和Fragment的生命周期