HDU - 6311:Cover(欧拉回路,最少的一笔画覆盖无向图)
The North can be regard as a undirected graph (not necessary to be
connected), one soldier can cover one path. Today there's no so many
people still breathing in the north, so the King wants to minimize the
number of soldiers he sent to cover each edge exactly once. As a master
of his, you should tell him how to arrange soldiers.
In the first line, two integers n and m, representing the number of nodes and edges in the graph.
In the following m lines, each contain two integers, representing two ends of an edge.
There are no parallel edges or self loops.
1≤n,m≤100000
OutputFor each test case, the first line contains number of needed routes, p.
For the following p lines, an integer x in the beginning, followed
by x integers, representing the list of used edges. Every integer should
be a positive or negative integer. Its absolute value represents the
number of chosen edge (1~n). If it's positive, it shows that this edge
should be passed as the direction as the input, otherwise this edge
should be passed in the direction different from the input. Edges should
be in correct order.Sample Input
3 3
1 2
1 3
2 3
Sample Output
1
3 1 3 -2
思路:把奇点配对,然后求欧拉回路。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int Laxt[maxn],Next[maxn<<],To[maxn<<],cnt,num;
int x[maxn],y[maxn],ind[maxn]; bool used[maxn],vis[maxn<<];
vector<int>G[maxn]; int tot,M;
void add(int u,int v)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; vis[cnt]=;
}
void dfs(int u,int f)
{
used[u]=;
for(int &i=Laxt[u];i;i=Next[i]){
if(!vis[i]){
vis[i]=vis[i^]=;
dfs(To[i],i);
}
}
if(!f) return ;
if(f<=(M<<|)) G[tot].push_back(f&?(f>>):-(f>>));
else tot++;
}
int main()
{
int N;
while(~scanf("%d%d",&N,&M)){
rep(i,,M) scanf("%d%d",&x[i],&y[i]);
cnt=; tot=;
rep(i,,N) Laxt[i]=used[i]=ind[i]=;
rep(i,,M) {
add(x[i],y[i]); add(y[i],x[i]);
ind[x[i]]++; ind[y[i]]++;
}
int x=;
rep(i,,N) {
if(ind[i]&){
if(x) add(x,i), add(i,x),x=;
else x=i;
}
}
rep(i,,N) if(!used[i]&&(ind[i]&)){
tot++; dfs(i,); tot--;
}
rep(i,,N) if(!used[i]&&ind[i]) {
tot++; dfs(i,);
}
printf("%d\n",tot);
rep(i,,tot) {
printf("%d",G[i].size()); int L=G[i].size();
rep(j,,L-) printf(" %d",G[i][j]); puts("");
}
rep(i,,tot) G[i].clear();
}
return ;
}
HDU - 6311:Cover(欧拉回路,最少的一笔画覆盖无向图)的更多相关文章
- HDU 6311 Cover (无向图最小路径覆盖)
HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- HDU - 6311 Cover(无向图的最少路径边覆盖 欧拉路径)
题意 给个无向图,无重边和自环,问最少需要多少路径把边覆盖了.并输出相应路径 分析 首先联通块之间是独立的,对于一个联通块内,最少路径覆盖就是 max(1,度数为奇数点的个数/2).然后就是求欧拉路 ...
- HDU - 6311 Cover (欧拉路径)
题意:有最少用多少条边不重复的路径可以覆盖一个张无向图. 分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1} 条路径.将奇度数的点两两相连边(虚边),然后先 ...
- hdu 5386 Cover (暴力)
hdu 5386 Cover Description You have an matrix.Every grid has a color.Now there are two types of oper ...
- HDU 6311 最少路径覆盖边集 欧拉路径
Cover Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 6311 欧拉回路
题意:求一个图(不一定联通)最小额外连接几条边,使得可以一笔画出来 大致做法 1.找出联通块 2.统计每一个连通块里面度数为奇数的点的个数, 有一个性质 一个图能够用一笔画出来,奇数点的个数不超过2个 ...
- hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配
Machine Schedule Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- hdu 1150 Machine Schedule 最少点覆盖
Machine Schedule Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- HDOJ 1878 欧拉回路 nyoj 42一笔画问题
#include<cstdio> #include<cstring> ]; int find(int x) { if(visited[x]!=x) return find(vi ...
随机推荐
- Qt5_pro_01
1. QT += core gui \ sql \ #ZC: 这个对应 #include <SQL/???> (如<QtSql/QSqlDatabase><QtSql/Q ...
- 如何学习编程和做好DBA
关于学习编程和做好DBA的关系 我这里只是讨论SQLSERVER DBA 我发现很多DBA都是从程序员开始做起的,一般做了4.5年之后就转型做DBA或者管理或者销售啊. 为什麽一开始不直接做DBA,D ...
- Thunder团队Final版爱阅app发布视频
视频链接:https://www.bilibili.com/video/av17008792/ 视频简介:首先出现的是我们团队的logo,接着是Final版爱阅app的功能展示,紧接着是我们团队的开发 ...
- 【Golang】解决Go test执行单个测试文件提示未定义问题
背景 很多人记录过怎么执行Go test单个文件或者单个函数,但是要么对执行单文件用例存在函数或变量引用的场景避而不谈,要么提示调用了其它文件中的模块会报错.其实了解了go test命令的机制之后,这 ...
- shuoj 418 丢史蒂芬妮(素数筛+sg函数)
丢史蒂芬妮 代码: #include<bits/stdc++.h> using namespace std; +; int SG[N][N]; bool S[N]; vector<i ...
- C# Random循环生成随机数重复问题解决方案
C# Random循环生成随机数重复问题解决方案1.当我们通过Random生成随机数时,习惯的写法如下: int a=new Random().Next(0,100); 然后生成一个数据数没有任何问题 ...
- 雷林鹏分享:Ruby 注释
Ruby 注释 注释是在运行时会被忽略的 Ruby 代码内的注释行.单行注释以 # 字符开始,直到该行结束,如下所示: #!/usr/bin/ruby -w # 这是一个单行注释. puts &quo ...
- 真核生物基因结构 & mRNA结构
参考: 分子生物学教材 再一次,翻看真核生物基因结构! mRNA基本结构特点 Structure and function of Messenger RNA (mRNA ) 基因结构 其实这个结构不完 ...
- WPF使用Webbrowser操作网页的主要代码
1,引用mshtml.dll using mshtml; 2,获取元素属性值 IHTMLDocument2 doc2=(IHTMLDocument)webbrowser1.Document; IHTM ...
- English trip V1 - 5.That's Amazing! 棒极了! Teacher:Patrick Key: can or can't
In this lesson you will learn to describe what people can do. 在本课中,您将学习如何描述人们可以做什么. STARTE drive a c ...