AGC035 B - Even Degrees【思维·树形结构的妙用】
一句话题意:

首先,每一条边会产生1个入度,1个出度,因此,如果边的数量是奇数的话,图的所有节点的总出度就是奇数,不可能每个节点的出度都是偶数,因此无解。
有解时,我们先找出原图中的一棵生成树,然后非树边可以随便定方向。
接下来从儿子到父亲遍历这棵树。
对于每个点,我们先处理完所有子节点,然后只考虑这个点与父节点之间边的方向。
如果当前节点出度为奇数,边的方向就是向父亲,否则,边的方向就是向当前节点。
这样我们可以保证除根节点外所有节点出度都是偶数。而总边数是偶数,所以根节点出度也是偶数。
因为奇偶是只需要留一条边来就可以保证的,那么需要确定一个合适的顺序,不会产生矛盾(不知道怎么说,大概就是有时候在图中$dp$需要拓扑排序那种感觉,要确定一个合适的递推顺序)。树就是一种符合这种条件的数据结构。
上代码:(代码里面有个注释掉的东西,应该是可以那么写的,但是想了想写生成树还是按边来我最顺手,毕竟考试的时候求稳)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define N 100005
#define M 100005
struct node{
int u,v;
}edge[M],ans[M];
int n,m,cnt;
vector<int>G[N],T[N];
bool vis[M];
//bool vis[N];
int d[N],ft[N];
int rt=-;
/*void dfs(int u,int f)
{
vis[u]=1;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(vis[v]||v==f) continue;
T[u].push_back(v);
T[v].push_back(u);
dfs(v,u);
}
}*/
int Find(int x)
{
if(ft[x]==x)
return x;
return ft[x]=Find(ft[x]);
}
bool Union(int x,int y)
{
int u=Find(x),v=Find(y);
if(u==v) return ;
if(u>v) ft[u]=v;
else ft[v]=u;
return ;
}
void dfs2(int u,int f)
{
//printf("%d\n",u);
for(int i=;i<T[u].size();i++)
{
int v=T[u][i];
if(v==f) continue;
dfs2(v,u);
}
if(u==rt) return ;
if(d[u]&) ans[++cnt].u=u,ans[cnt].v=f,d[u]++;
else ans[++cnt].u=f,ans[cnt].v=u,d[f]++;
//printf("%d %d %d %d\n",u,d[u],ans[cnt].u,ans[cnt].v);
}
void Init()
{
for(int i=;i<=n;i++)
ft[i]=i;
int tot=;
for(int i=;i<=m;i++)
{
if(Union(edge[i].u,edge[i].v))
{
T[edge[i].u].push_back(edge[i].v);
T[edge[i].v].push_back(edge[i].u);
if(rt==-) rt=edge[i].u;
vis[i]=;
tot++;
}
if(tot==n-) break;
}
cnt=;
for(int i=;i<=m;i++)
if(!vis[i])
{
ans[++cnt].u=edge[i].u,ans[cnt].v=edge[i].v;
d[edge[i].u]++;
//printf("**%d %d\n",edge[i].u,edge[i].v);
}
dfs2(rt,-);
}
int main()
{
//freopen("degree.in","r",stdin);
//freopen("degree.out","w",stdout);
scanf("%d %d",&n,&m);
if(m&)
{
puts("-1");
return ;
}
for(int i=;i<=m;i++)
{
int u,v;scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(v);
edge[++cnt].u=u,edge[cnt].v=v;
}
//dfs(1);//Find ST
Init();//Find ST
for(int i=;i<=cnt;i++)
printf("%d %d\n",ans[i].u,ans[i].v);
return ;
}
Code
AGC035 B - Even Degrees【思维·树形结构的妙用】的更多相关文章
- sqlite3树形结构遍历效率对照測试
sqlite3树形结构遍历效率对照測试 一.缘起 项目数据结构:本人从事安防行业,视频监控领域.项目中会遇到监控点位的组织机构划分.暂时划分的巡逻点位等.这些相机点位.连同组织机构,它们在逻辑关系上构 ...
- js文章列表的树形结构输出
文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...
- GridView 树形结构分组的功能
在“会飞的鱼”博客中看到GridView实现树形结构的代码,经过修改,添加了树形结构中的复选框功能,欢迎吐槽. 源地址:http://www.cnblogs.com/chhuic/archive/20 ...
- [从产品角度学EXCEL 02]-EXCEL里的树形结构
这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...
- C# EasyUI树形结构权限管理模块
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本节和大家探讨下C#使用EasyUI树形结构/Tree构 ...
- YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计
树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>政府>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排 ...
- Java创建树形结构算法实例
在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBe ...
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...
- 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件
看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...
随机推荐
- 【洛谷P3957】跳房子
题目大意:给定一个数轴和 N 个点,点有点权,现从 0 位置出发,初始时每次只能走 d 的距离,可以在数轴上任意位置停下,此时,会得到一个点权和.现允许支付 x 的费用,使得每次可以走的距离为一个范围 ...
- k8s命令集锦
集群环境相关命令$kubectl vertion --short=true #显示当前使用的客户端及服务端程序版本信息$kubectl cluster-info #获取集群信息$kubectl api ...
- Jquery+json绑定带层次下拉框(select控件)
一.实现的效果图 备注: 1.主要实现添加类别绑定到Ztree树之后,select下拉框在不刷新页面的情况下,通过Jquery重新绑定问题,增加用户体验度: 2.这个只是实现两层的绑定,通过sql语句 ...
- 关于python-selenium-chromedriver提示
问题一:AttributeError: module 'selenium.webdriver' has no attribute 'Chromedriver' 配置selenium环境时,执行代码 f ...
- 19.tcp_upd
# socket编程 # 01010 ethernet(你在教室的那个位置)mark ip(教室在哪,主机)子网 tcp,udp(端口)应用程序在哪 # 物理层---->数据链路层------- ...
- 窗体操作:GetWindowLong()
函数原型: LONG GetWindowLong( HWND hWnd,int nIndex ) 参数: hWnd:指定窗口的句柄 nIndex:需要获得的信息的类型 值 ...
- 手动升级 Confluence 6 - 升级以后
7. 重新安装服务(仅针对 Windows) 如果你的 Confluence 安装实例在 Windows 中是以服务来运行的话,你需要删除已经存在的 Windows 服务,然后重新安装 Windows ...
- scrapy项目5:爬取ajax形式加载的数据,并用ImagePipeline保存图片
1.目标分析: 我们想要获取的数据为如下图: 1).每本书的名称 2).每本书的价格 3).每本书的简介 2.网页分析: 网站url:http://e.dangdang.com/list-WY1-dd ...
- UMG里没有"Prefab"怎么办?
大家知道在Unity里做UI,利用Prefab是少不了的,但是在UE4里如何做呢? 这是实际工作中遇到的问题,我Google关键词“UMG Prefab","UMG resuabl ...
- Spring Boot教程(三十)使用Spring-data-jpa(1)
在实际开发过程中,对数据库的操作无非就“增删改查”.就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯燥的语句来完成业务逻辑. 为了解决这些大量枯燥的数据操作语句 ...