2018杭电多校第二场1003(DFS,欧拉回路)
#include<bits/stdc++.h>
using namespace std;
int n,m;
int x,y;
int num,cnt;
int degree[100007],vis[100007],viss[400040],first[100007];
vector<int>jidian,road[100007];
struct node
{
int v,next;
}xu[400040];
void init()//初始化
{
num=0,cnt=1;
memset(degree,0,sizeof(degree));
memset(vis,0,sizeof(vis));
memset(viss,0,sizeof(viss));
memset(first,-1,sizeof(first));
jidian.clear();
}
void add_edge(int u,int v)//将点联接
{
xu[++cnt].v=v;
xu[cnt].next=first[u];
first[u]=cnt;
}
void dfs(int u)//寻找度数为奇数的点
{
vis[u]=1;
if(degree[u]&1)
jidian.push_back(u);
for(int i=first[u];i!=-1;i=xu[i].next)
{
int v=xu[i].v;
if(!vis[v])
dfs(v);
}
}
void dfss(int u)//将要走的点存进向量,绘制路线
{
for(int i=first[u];i!=-1;i=xu[i].next)
{
if(!viss[i])
{
viss[i]=viss[i^1]=1;//与1异或可以得到相邻的点,如:(1,2),(3,4)等
int v=xu[i].v;
dfss(v);
if(i>2*m+1)//该点为奇点
{
num++;//增加一笔
}
else
{
int jiedian=i&1?(i/2):((-1)*(i/2));//如果是偶数的话,当时建边是是反向边
road[num].push_back(jiedian);
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add_edge(x,y);//建边
add_edge(y,x);
degree[x]++;//记录节点度数
degree[y]++;
}
for(int i=1;i<=n;i++)
{
if(!vis[i]&°ree[i])//没有被访问过并且不是孤立的节点
{
dfs(i);
int siz=jidian.size();//度数为奇数的数量
for(int j=2;j<siz;j+=2)//跳过欧拉回路中至少存在的两个奇点
{
add_edge(jidian[j],jidian[j+1]);
add_edge(jidian[j+1],jidian[j]);
}
num++;
if(jidian.size())
dfss(jidian[0]);//从多余的奇点出发
else
dfss(i);//否则就从随意一个点出发
jidian.clear();
}
}
printf("%d\n",num);
for(int i=1;i<=num;i++)
{
int sizz=road[i].size();
printf("%d ",sizz);
for(int j=0;j<sizz-1;j++)
{
printf("%d ",road[i][j]);
}
printf("%d\n",road[i][sizz-1]);
road[i].clear();
}
}
return 0;
}
/*欧拉图:图中只有两个度数为奇数的点,或者所有点的度数均为偶数,
这样我们只要选择一个度数为奇数的点作为起点跑一遍欧拉回路同时记录路径即可
(如果所有点的度数都是偶数的话就选任意一个点就行了),
我们dfs求完欧拉路径,然后遇到虚边,num++,
放入另外的一个队列中(相当于上图右边切断虚边,变成了两段,最后输出所有路径方案*/
2018杭电多校第二场1003(DFS,欧拉回路)的更多相关文章
- hdu6312 2018杭电多校第二场 1004 D Game 博弈
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 2018 Multi-University Training Contest 2 杭电多校第二场
开始逐渐习惯被多校虐orz 菜是原罪 1004 Game (hdoj 6312) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312 虽然披着 ...
- 杭电多校第二场 hdu 6315 Naive Operations 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...
- 2019杭电多校第二场hdu6602 Longest Subarray(线段树)
Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...
- 杭电多校第二场 1005 hack it
题意: 构造一个n*n 的 01 矩阵, 0 < n < 2001, 矩阵需要满足没有一个子矩阵的4个角都是1,并且矩阵内1的个数至少有85000个. 题解:数论构造题 参考From 代 ...
- 2019年杭电多校第二场 1008题Harmonious Army(HDU6598+最小割+建图)
题目链接 传送门 题意 有\(n\)个士兵,要你给他们分配职业.有\(m\)对关系,对于某一对关系\(u,v\),如果同为勇士则总能力增加\(a\),同法师则增加\(c\),一个勇士一个法师增加\(\ ...
- 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)
题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...
- 2019年杭电多校第二场 1002题Beauty Of Unimodal Sequence(LIS+单调栈)
题目链接 传送门 思路 首先我们对\(a\)正反各跑一边\(LIS\),记录每个位置在前一半的\(LIS\)中应该放的位置\(ans1[i]\),后一半的位置\(ans2[i]\). 对于字典序最小的 ...
随机推荐
- ajax调试小技巧
在编写ajax时出现了问题,通过myXmlHttpRequest.responseXML无法获取值. 可以尝试打印出responseText的值.截图如下所示:
- MVC中Controller弹出提示框
1.删除时查询是否有先关数据,有提示删除相关数据:成功刷新页面:失败提示删除失败 Controller: 有相关数据:return RedirectToAction("Index" ...
- Educational Codeforces Round 30D. Merge Sort
归并排序的逆操作,每次二分时把第二段第一位与第一段最后一位开始往前第一个比它大的数交换位置 可以用归并排序验证答案对不对 #include<bits/stdc++.h> #define f ...
- 【leetcode刷题笔记】Search a 2D Matrix
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- Xposed模块开发学习记录
Xposed模块相关API可以参考在线文档: https://api.xposed.info/reference/packages.html 入门教程可以参考: https://github. ...
- 扩展欧几里得算法(exgcd)
Bezout定理: 对于任意整数a,b,存在一对整数x,y满足:a*x+b*y=gcd(a,b) 证明如下: 在欧几里得算法的最后一步:b=0,即:gcd(a,0)=a 对于b>0,根据欧几里得 ...
- Linux编程之错误代码
头文件/usr/include/asm-generic/errno-base.h定义错误码: #ifndef _ASM_GENERIC_ERRNO_BASE_H #define _ASM_GENERI ...
- bzoj 2850 巧克力王国 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2850 只要暴力判断是否全选一个子树或全不选,如果都不是就进入查询: 要注意值有负,所以不是直 ...
- Starting MySQL....The server quit without updating PID file错误解决办法
出现错误:Starting MySQL....The server quit without updating PID file 检查错误文件: /var/lib/mysql/xxxx.err,根据其 ...
- Foreman-porxy负载均衡搭建
本文接上篇puppet负载均衡的环境实验. Foreman-proxy可以采用四层或者七层负载,都可以实现,在foreman的web界面添加一个smart-proxy,后端多个真实foreman-pr ...