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

Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1967 Accepted Submission(s): 442

Special Judge

Problem Description

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.

Input

There 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

Output

For 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

题目解析

题意是问一个图最少几笔能够画完,把每一笔输出出来。

有一个规律很容易发现,就是一个不存在欧拉回路的图,需要奇点数/2笔画完,具体是怎么操作的呢

  1. 建图
  2. 每两个奇点之间连一条边
  3. 从原奇点开始,DFS欧拉回路,删去加进来的边,得到结果
  4. DFS剩下的联通块,得到结果

代码

#include<iostream>
#include<vector>
#include<cstring>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 100010;
struct Edge
{
int from,to,next;
int num;
int d;
}edge[maxn<<4];
int vis[maxn<<4];
int head[maxn];
int du[maxn];
int tol;
int n,m,cnt;
vector<int> st;
vector<int> ans[maxn]; void init()
{
cnt = 1;
tol = 0;
CLR(head,-1);
CLR(vis,0);
CLR(du,0);
for(int i = 1; i <= maxn; i++)
ans[i].clear();
st.clear();
} void addedge(int u,int v,int num,int d)
{
edge[tol].from = u;
edge[tol].to = v;
edge[tol].num = num;
edge[tol].d = d;
edge[tol].next = head[u];
head[u] = tol++;
} void dfs(int st)
{
for(int i = head[st]; i!=-1; i = edge[i].next){
if( vis[edge[i].num]) continue;
vis[edge[i].num] = 1; dfs(edge[i].to);
if(edge[i].d == 0){
cnt++;
}
else{
ans[cnt].push_back(edge[i].d*edge[i].num*-1);
}
}
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i = 1; i <= m; i++){
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v,i,1);
addedge(v,u,i,-1);
du[v]++;
du[u]++;
} int sig = m;
int tmp = 0;
for(int i = 1; i <= n; i++){
if(tmp == 0 && du[i]%2 == 1){
tmp = i;
du[tmp]++;
}
else if(tmp && du[i]%2 == 1){
addedge(i,tmp,++sig,0);
addedge(tmp,i,sig,0);
du[i]++;
st.push_back(tmp);
tmp = 0;
}
} for(int i = 0; i < st.size(); i++){
dfs(st[i]);
}
for(int i = 0; i < tol; i++){
if(!vis[edge[i].num]){
dfs(edge[i].from);
cnt++;
}
} printf("%d\n",cnt-1);
for(int i = 1; i < cnt; i++){
printf("%d ",ans[i].size());
for(int j = 0; j < ans[i].size(); j++){
printf("%d ",ans[i][j]);
}
printf("\n");
}
}
return 0;
}

HDU 6311 Cover (无向图最小路径覆盖)的更多相关文章

  1. (step6.3.4)hdu 1151(Air Raid——最小路径覆盖)

    题意:     一个镇里所有的路都是单向路且不会组成回路. 派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务.每个在一个路口着陆了的伞兵可以沿着街去 ...

  2. HDU 4160 Dolls (最小路径覆盖=顶点数-最大匹配数)

    Dolls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  3. hdu 1151 Air Raid 最小路径覆盖

    题意:一个城镇有n个路口,m条路.每条路单向,且路无环.现在派遣伞兵去巡逻所有路口,伞兵只能沿着路走,且每个伞兵经过的路口不重合.求最少派遣的伞兵数量. 建图之后的就转化成邮箱无环图的最小路径覆盖问题 ...

  4. hdu6311 /// 欧拉路径 无向图最小路径覆盖 输出正反路径

    题目大意: 给定n m 为图的点数和边数 接下来m行 u v 为u到v有一条边 要求最少几笔能画完图的所有边 输出每笔画过的路径编号 正数编号正向 负数编号反向 题解:https://www.cnbl ...

  5. hdu 1151 Air Raid(二分图最小路径覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=1151 Air Raid Time Limit: 1000MS   Memory Limit: 10000K To ...

  6. HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 最小路径覆盖的一篇博客:https://blog.csdn.net/qq_39627843/ar ...

  7. 缩点+最小路径覆盖 hdu 3861

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 题意:输入t,表示t个样例.接下来每个样例第一行有两个数n,m表示点数和有向边的数量,接下来输入 ...

  8. HDU 3861.The King’s Problem 强联通分量+最小路径覆盖

    The King’s Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  9. (匹配 最小路径覆盖)Air Raid --hdu --1151

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1151 http://acm.hust.edu.cn/vjudge/contest/view.action ...

随机推荐

  1. iTOP-iMX6UL全能板-linux-usb-wifi的使用

    本文档介绍的是在本文档介绍的是在 Linux 系统环境下iTOP-imx6ul全能版 usb wifi 连接路由器上网 实验调试步骤.我们使用的是 imx6ul 全功能底板. 1 硬件 本文档测试使用 ...

  2. Linux Shell远程执行命令

    1.问题描述 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,下边介绍shell命令远程执行的方法. 前提: 远程电脑之间已经配置ssh免密码登陆 2.脚本方 ...

  3. day 14 - 2 生成器练习

    相关练习 1.处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕 #比较 low 的方法 def check_file(filename,aim): with open( ...

  4. css :root 选择器

    :root css 伪类匹配文档的根元素. 对于 HTML 来说, :root 表示<html>元素,除了优先级更高之外,与 html 选择器相同. 在声明全局 css 变量时 :root ...

  5. oracle 11.2.0.4 rac 修改 ip vip scan ip

    修改前host文件 198.27.73.21 ht-d01 198.27.73.22 ht-d02 198.27.73.25 ht-d01-vip 198.27.73.26 ht-d02-vip 19 ...

  6. iis7 设置自定义404页面无效解决方案

    想给自己做的的网站自定义一个404页面,开始 双击红框提示的错误页图标 双击上图红框提示的所示404行 修改上图红框提示的内容如下:我是直接在根目录放了一个自己做的404.html,实际情况要填写你自 ...

  7. Navicat for MySQL 连接Mysql8.0 报 1251

    先设置Mysql全局 cmd下输入: mysql -uroot -p root密码 use mysql; update user set host = "%" where user ...

  8. day13.装饰器进阶,迭代器

    1.from functools import wraps 这个函数可以保留原来函数的属性 # from functools import wraps def car_time(fun): # @wr ...

  9. 反转链表II(根据指定的索引,逆转链表)

    反转从位置 m 到 n 的链表.请使用一趟扫描完成反转 思想:首先判断链表是否合法,并且判断输入的m和n是否合法 定义dummyHead结点,让它指向头结点的前驱,再定义cur,让它指向dummyHe ...

  10. 一道很经典的 BFS 题

    一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...