The Wall has down and the King in the north has to send his soldiers to sentinel.
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.
InputThere might be multiple test cases, no more than 20. You need to read till the end of input.

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(欧拉回路,最少的一笔画覆盖无向图)的更多相关文章

  1. HDU 6311 Cover (无向图最小路径覆盖)

    HDU 6311 Cover (无向图最小路径覆盖) Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...

  2. HDU - 6311 Cover(无向图的最少路径边覆盖 欧拉路径)

    题意 给个无向图,无重边和自环,问最少需要多少路径把边覆盖了.并输出相应路径 分析 首先联通块之间是独立的,对于一个联通块内,最少路径覆盖就是  max(1,度数为奇数点的个数/2).然后就是求欧拉路 ...

  3. HDU - 6311 Cover (欧拉路径)

    题意:有最少用多少条边不重复的路径可以覆盖一个张无向图. 分析:对于一个连通块(单个点除外),如果奇度数点个数为 k,那么至少需要max{k/2,1}  条路径.将奇度数的点两两相连边(虚边),然后先 ...

  4. hdu 5386 Cover (暴力)

    hdu 5386 Cover Description You have an matrix.Every grid has a color.Now there are two types of oper ...

  5. HDU 6311 最少路径覆盖边集 欧拉路径

    Cover Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. hdu 6311 欧拉回路

    题意:求一个图(不一定联通)最小额外连接几条边,使得可以一笔画出来 大致做法 1.找出联通块 2.统计每一个连通块里面度数为奇数的点的个数, 有一个性质 一个图能够用一笔画出来,奇数点的个数不超过2个 ...

  7. hdu 1150 Machine Schedule 最少点覆盖转化为最大匹配

    Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  8. hdu 1150 Machine Schedule 最少点覆盖

    Machine Schedule Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  9. HDOJ 1878 欧拉回路 nyoj 42一笔画问题

    #include<cstdio> #include<cstring> ]; int find(int x) { if(visited[x]!=x) return find(vi ...

随机推荐

  1. iterator_教程中的讲解

    ZC: 在讲 vector的时候讲到的 1.分类: (1).输入(只读) 只支持一遍算法 (2).输出(只写) 只支持一遍算法 (3).正向 可对一个值进行多次读写 ==> 相当于 输入迭代器+ ...

  2. Bata冲刺 第一天

    一.冲刺第一天完成任务情况及贡献小时数: 姓名 今日已完成任务 时间(h) 马仲山 代码调整 2 马婧(12) 整理需求文档 2 马婧(13) 整理设计文档 2 马世芳 编写测试文档 2 张俊逸   ...

  3. 语言小知识-MySQL数据库引擎

    MySQL作为全世界广受欢迎的数据库,被用于很多中小型的项目中,但是你对 MySQL 数据库的存储引擎了解多少呢? 我们将逻辑表中的数据存储到数据库中,数据库又将我们表中的数据存储到物理设备中(如磁盘 ...

  4. eclipse启动时弹出Failed to create the Java Virtual Machine

    eclipse启动时弹出Failed to create the Java Virtual Machine 一.现象 今天装eclipse的时候出现Failed to create the Java ...

  5. crond 的注意点

    本来在控制台调试的好好的程序,一通过crond运行, 就执行不了. 一般需要注意: 1) 环境变量 当前目录 会变成用户的Home 2)  /var/log/messages 可以看出 crond 调 ...

  6. temp table

    在Oracle8i或以上版本中,可以创建以下两种临时表: 1.会话特有的临时表 CREATE GLOBAL TEMPORARY <TABLE_NAME> ( <column spec ...

  7. bzoj 1267 Kth Number I (点分治,堆)

    超级钢琴的树上版本, 类似做法即可, 只不过区间转为dfs序了, 用点分求一下, 复杂度$O(nlog^2n)$ #include <iostream> #include <algo ...

  8. Visio 入门教程

    最近做一个新项目,目前在需求确立阶段,所以每天任务是写文档讨论再修改.由于是云端架构设计,避免不了图形图表配合文字说明,需要制作 E-R 图.网络图.时序图.UML 类图等,对比其他可视化图表工具,V ...

  9. linux进程原语之fork()

    一.用法解析: fork()这个函数,可以说是名如其人了,众所周知fork这个单词本意为叉子,老外取学术名字的时候总会有一些象形的想法,于是就有了下图~ fork()函数是计算机程序设计中的分叉函数. ...

  10. dp练习(6)——搬运礼物

    3409 搬运礼物 CodeVS原创  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description 小浣熊松松特别喜欢交 ...