bryce1010模板

http://acm.hdu.edu.cn/showproblem.php?pid=6311



从dls思路中,我整理一下自己的思路:

1、首先也是建图

2、建图结束后,一个dfs查找联通块和度数为奇数的点

从第二对奇数度点开始给奇数度点对开始加辅助边(>2*m+1)

3. 加辅助边后,一个dfs搜索所有的奇数度顶点,如果碰到一个虚边,则res+2;

最后一笔画的个数为max(res/2,1)

/*hdu6311cover
题意:给出一张无向图,问多少次一笔画能覆盖整张图。
dls的思路:
1.对给出的数据建图
2.搜索图中的联通块和度为奇数的点
3.在联通块内的奇数对额外添加虚边(添加奇数点个数/2条边)
4.dfs得到最后结果 一张联通图n笔画完,则n=max(|degree(奇数)|/2,1)
每次添加一条边,则度数+2
当图上至多只有一对奇数度的点时,便可以一笔走过所有的边
删除额外添加的边(序号为>2*m+1)得到结果
*/ #include<bits/stdc++.h>
using namespace std; const int MAXN=1e5+10;
struct Edge
{
int to,next;//to保存终点,next保存邻接的边
bool able;
}edge[MAXN<<2]; int n,m;
int Degree[MAXN];//每个点的度
int Head[MAXN];//每个点的最后一条边加入的边的序号
int cnt;//边的序号
int res;//一共找到的路径 bool vis[MAXN];
vector<int>st;//保存一个连通块中度为奇数的点
vector<int>road[MAXN]; void add(int u,int v)
{
edge[++cnt].next=Head[u];
edge[cnt].to=v;
edge[cnt].able=true;
Head[u]=cnt;
++Degree[u];
}
void add_edge(int u,int v)
{
add(u,v);
add(v,u);
} //找到联通块和奇数点的度
void dfs(int s)
{
vis[s]=true;
if(Degree[s]&1)st.push_back(s);
for(int i=Head[i];i;i=edge[i].next)
{
if(!vis[edge[i].to])dfs(edge[i].to);
}
} void dfs2(int s)
{
for(int i=Head[s];i;i=edge[i].next)
{
if(edge[i].able)
{
edge[i].able=edge[i^1].able=false;
dfs2(edge[i].to);
if(i>2*m+1)++res;//说明此边是由奇数度添加得到的,所以这条回路结束
else
{
road[res].push_back(i/2*(2*(i&1)-1));
}
}
}
} int main()
{
int u,v;
while(cin>>n>>m)
{
cnt=1;res=0;
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
add_edge(u,v);
}
for(int i=1;i<=n;i++)
{
if(!vis[i]&&Degree[i])
{
dfs(i);//找到联通块和奇数度的点
if(st.empty())
{
st.push_back(i);
st.push_back(i);
}
for(int j=2;j<st.size();j+=2)
{//从第二对开始的奇数度的点添加一条双向边
add_edge(st[j],st[j+1]);
}
res++;
dfs2(st[0]);
st.clear();
}
}
printf("%d\n",res);
for(int i=1;i<=res;i++)
{
printf("%d",road[i].size());
for(int j=0;j<road[i].size();j++)
{
printf(" %d",road[i][j]);
}
puts("");
road[i].clear();
}
for(int i=1;i<=n;i++)
{
vis[i]=false;
Head[i]=0;
Degree[i]=0;
} return 0; } }

hdu6311( 2018 Multi-University Training Contest 2)的更多相关文章

  1. ( 2018 Multi-University Training Contest 2)

    2018 Multi-University Training Contest 2) HDU 6311 Cover HDU 6312 Game HDU 6313 Hack It HDU 6314 Mat ...

  2. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  3. HDU 5726 GCD (2016 Multi-University Training Contest 1)

      Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description Give y ...

  4. HDU 4897 Little Devil I(树链剖分)(2014 Multi-University Training Contest 4)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4897 Problem Description There is an old country and ...

  5. HDU 4906 Our happy ending(2014 Multi-University Training Contest 4)

    题意:构造出n个数 这n个数取值范围0-L,这n个数中存在取一些数之和等于k,则这样称为一种方法.给定n,k,L,求方案数. 思路:装压 每位 第1为表示这种方案能不能构成1(1表示能0表示不能)   ...

  6. (2018 Multi-University Training Contest 3)Problem D. Euler Function

    //题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6322 //题目大意:给定 k,求第 k 小的数 n,满足 φ(n) 是合数.显然 φ(1) = 1 ...

  7. hdu6315( 2018 Multi-University Training Contest 2)

    bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6315 /*hdu 1007 首先我们在建立线段树之前应该思考的是线段树的节点维护一个什么 ...

  8. hdu6314( 2018 Multi-University Training Contest 2)

    bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6314 ----. 又是一个数学题! 这个题使用容斥原理解决的,现场看dls推公式. 我也 ...

  9. hdu6313( 2018 Multi-University Training Contest 2)

    bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6313 参考dls的讲解: 以5*5的矩阵为例: 后一列分别对前一列+0+1+2+3+4操 ...

随机推荐

  1. js程序开发-2

    <h1>DOM节点操作</h1> createElement() 创建节点:返回一个元素对象; cloneNode() 克隆节点,接受一个参数deep,值为true或false ...

  2. hdu 6058

    \(f(l,r,k)=\)区间[\(l\),\(r\)]的第k大. \(\sum_{l=1}^{n}{\sum_{r=l}^{n}{f(l,r,k)}}\) 参考题解,claris大佬题解.赛后AC. ...

  3. [SHOI 2007] 善意的投票

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1934 [算法] 首先 , 选择睡觉的人和不选择睡觉的人构成两个集合 这启发我们用最小 ...

  4. windows下的套接字IO模型

    一般情况下,IO操作的行为受两种因素的影响: IO操作对象的类型(阻塞还是非阻塞) 获取IO操作结果的方式(同步还是异步). 同步就是指操作的发起和操作结果的获取由调用者完成. 异步指操作发起由调用方 ...

  5. 【220】◀▶ IDL 数组操作函数说明

    参考:Array Creation Routines —— 创建数组函数参考:Array Manipulation Routines —— 操作数组函数 01   MAX 最大值. 02   MIN ...

  6. Win10资源管理器中的库文件夹按照修改日期排序

    win7之后添加的库十分的好用,可以将下载,音乐,文档设置在我的电脑(win10叫此电脑)首页,快速进入. 我对文件夹设置了按照时间排序,这样进去就可以直接看到最近下载了什么文件.但是win10用时间 ...

  7. java中关键字volatile的误解和使用

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...

  8. [CVE-2014-3704]Drupal 7.31 SQL注入漏洞分析与复现

    记录下自己的复现思路 漏洞影响: Drupal 7.31 Drupal是一个开源内容管理平台,为数百万个网站和应用程序提供支持. 0x01漏洞复现 复现环境: 1) Apache2.4 2) Php ...

  9. 模板 - 洲阁筛 + min25筛

    好像在某些情况下杜教筛会遇到瓶颈,先看着.暑假学一些和队友交错的知识的同时开这个大坑.

  10. CodeForces 689B【最短路】

    题意: 给你一副图,给出的点两两之间的距离是abs(pos1-pos2),然后给你n个数是表示该pos到x的距离是1. 思路: 直接建边,跑spfa就好了.虽然说似乎题意说边很多,其实只要建一下相邻的 ...