博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 527E Data Center Drama(欧拉回路)
阅读量:6046 次
发布时间:2019-06-20

本文共 1542 字,大约阅读时间需要 5 分钟。

题意:

  给定一个无向图连通图,把这个的无向边变成有向边,并添加最少的有向边使这个图每个结点的出度为偶数。

 

Solution:

    题目很长,并且很多条件说的不太直接,确实不太好懂。

    首先先看得到的无向图,是不是可以不加边就满足题目要求。

    可以想到对于一个无向图,当所有点的度数为偶数时,图中存在欧拉回路。那么对于一个存在欧拉路的无向图似乎可以以某种方式构造出满足条件的有向边。假设图中有欧拉回路1 2 3 4 1, 可以构造边2->1,2->3,4->3,4->1满足条件。

    而对于不存在欧拉回路的图,可以在度数为奇数的两个节点间加一条边,或者添加自环使图中构成欧拉回路。

    用邻接表会超时,用set维护边集,每次用过的边删除,能极大地节省时间。

    找到欧拉路后,用上面的方法构造有向边输出就好了。

 

#include 
using namespace std;const int MAXN = 1000009;int deg[MAXN], n, m, nCnt;vector
ans;multiset
G[MAXN];inline void EulerianP (int x) { while (!G[x].empty() ) { int v = *G[x].begin(); G[x].erase (G[x].begin() ); G[v].erase (G[v].find (x) ); EulerianP (v); } ans.push_back (x);}int main() { scanf ("%d %d", &n, &m); for (int i = 1, u, v; i <= m; i++) { scanf ("%d %d", &u, &v); G[u].insert (v), G[v].insert (u); deg[u]++, deg[v]++; nCnt ++; } vector
s; for (int i = 1; i <= n; i++) if (deg[i] & 1) s.push_back (i); for (int i = 0; i < int (s.size() - 1); i += 2) G[s[i]].insert (s[i + 1]), G[s[i + 1]].insert (s[i]), nCnt ++; if (s.size() & 1) nCnt ++; nCnt += nCnt & 1; EulerianP (1); printf ("%d\n", nCnt); for (int i = 0; i < (int) ans.size() - 1; i++) { if (i & 1) printf ("%d %d\n", ans[i], ans[i + 1]); else printf ("%d %d\n", ans[i + 1], ans[i]); } if (ans.size() % 2 == 0) puts ("1 1");}
View Code

 

转载于:https://www.cnblogs.com/keam37/p/4385351.html

你可能感兴趣的文章
这个季节的忧伤,点到为止
查看>>
mysql通过配置文件进行优化
查看>>
省级网站群建设关注点
查看>>
工作第四天之采集资源
查看>>
innobackupex 在增量的基础上增量备份
查看>>
Windows Server 2012 R2 DirectAccess功能测试(2)App1服务器安装及配置
查看>>
基于清单的启动器的实现
查看>>
外网用户通过citrix打印慢的解决方法
查看>>
STL容器的使用
查看>>
关于std::map
查看>>
JXL导出Excel文件兼容性问题
查看>>
VBoot1.0发布,Vue & SpringBoot 综合开发入门
查看>>
centos7 安装wps 后 演示无法启动
查看>>
git简单命令
查看>>
LAMP编译部署
查看>>
XenDesktop7.6安装部署入门教程
查看>>
HashMap的工作原理及HashMap和Hashtable的区别
查看>>
GregorianCalendar日历程序
查看>>
Sublime 中运行 Shell 、Python、Lua、Groovy...等各种脚本
查看>>
【Java集合源码剖析】ArrayList源码剖析
查看>>