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 ...
随机推荐
- Python学习笔记_Python向Excel写入数据
实验环境 1.OS:Win 10 64位 2.Python 3.7 3.如果没有安装xlwt库,则安装:pip install xlwt 下面是从网上找到的一段代码,网上这段代码,看首行注释行,是在L ...
- 基于unittest测试框架的扩展
1 unittest介绍 Unittest,Python自带的单元测试框架,PyUnit类包含TestResult,TestCase, TestSuite,TextTestResult,TextTes ...
- linux Shell中常用的条件判断
linux Shell中常用的条件判断 -b file 若文件存在且是一个块特殊文件,则为真 -c file 若文件存在且是一个字符特殊文件,则为真 -d ...
- Responsive设计——meta标签
media-queries.js(http://code.google.com/p/css3-mediaqueries-js/) respond.js(https://github.com/scott ...
- http请求和返回的head字段
一,http请求分请求首部字段,通用首部字段,实体首部字段.http响应包含响应首部字段,通用首部字段,实体首部字段. 二,http1.1定义了47种首部字段.1,通用首部字段:cache-contr ...
- 2.3.2 volatile 说明
volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字才得以 ...
- Java 集合框架必记框架图
- Redesign Your App for iOS 7 之 页面布局【转】
前言 iOS7是目前iOS史上最颠覆的一次改版. 它的出现令人兴奋,因为它将会带我们进入一个全新的时代: 它的到来也让我们忧心,因为它颠覆了一切,包括我们过去做过的很多努力. 但是,相信大家乐意为这个 ...
- JSP+JDBC实现在可视化页面中插入数据到SQL数据库
原创 本篇博客创建一个如下图所示的JSP页面,将用户填入的数据插入到对应的数据库中. JSP页面代码: <%@ page language="java" contentTyp ...
- 挂载ISO 和 KILL 掉占用进程
mount -t iso9660 -o loop,user VMware-tools-linux-8.6.0-425873.iso /mnt/cdrom fuser -m -v -i -k /mnt ...