1527:【例 1】欧拉回路

时间限制: 1000 ms         内存限制: 262144 KB

【题目描述】

原题来自:UOJ #117

有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。

一共两个子任务:

这张图是无向图。(50 分)

这张图是有向图。(50 分)

【输入】

第一行一个整数 t,表示子任务编号。t∈{1,2},如果 t=1 则表示处理无向图的情况,如果 t=2 则表示处理有向图的情况。

第二行两个整数 n,m,表示图的结点数和边数。

接下来 m 行中,第 i 行两个整数 vi,ui ,表示第 i 条边(从 1 开始编号)。保证 1≤vi,ui≤n。

如果 t=1 则表示 vi 到 ui 有一条无向边。

如果 t=2 则表示 vi 到 ui 有一条有向边。

图中可能有重边也可能有自环。

【输出】

如果不可以一笔画,输出一行 NO。

否则,输出一行 YES,接下来一行输出一组方案。

如果 t=1,输出 m 个整数 p1,p2,…,pm 。令 e=|pi|,那么 e 表示经过的第 i 条边的编号。如果 pi为正数表示从 ve 走到 ue ,否则表示从 ue 走到 ve 。

如果 t=2,输出 m 个整数 p1,p2,…,pm 。其中 pi 表示经过的第 i 条边的编号。

【输入样例】

1
3 3
1 2
2 3
1 3

【输出样例】

YES
1 2 -3

【提示】

样例输入 2

2
5 6
2 3
2 5
3 4
1 2
4 2
5 1

样例输出 2

YES
4 1 3 5 2 6

数据范围与提示:

1≤n≤10^5,0≤m≤2×10^5

--------------------------放了一大坨概念在下面--------------------------

欧拉回路和欧拉路径的几个概念:

欧拉环:图中经过每条边一次且仅一次的环;

欧拉路径:图中经过每条边一次且仅一次的路径;
欧拉图:有至少一个欧拉环的图;
半欧拉图:没有欧拉环,但有至少一条欧拉路径的图。

【无向图】
一个无向图是欧拉图当且仅当该图是连通的(注意,不考虑图中度为0的点,因为它们的存在对于图中是否存在欧拉环、欧拉路径没有影响)且所有点的度数都是偶数;一个无向图是半欧拉图当且仅当该图是连通的且有且只有2个点的度数是奇数(此时这两个点只能作为欧拉路径的起点和终点);

证明:因为任意一个点,欧拉环(或欧拉路径)从它这里进去多少次就要出来多少次,故(进去的次数+出来的次数)为偶数,又因为(进去的次数+出来的次数)=该点的度数(根据定义),所以该点的度数为偶数。

【有向图】
一个有向图是欧拉图当且仅当该图的基图(将所有有向边变为无向边后形成的无向图,这里同样不考虑度数为0的点)是连通的且所有点的入度等于出度;一个有向图是半欧拉图当且仅当该图的基图是连通的且有且只有一个点的入度比出度少1(作为欧拉路径的起点),有且只有一个点的入度比出度多1(作为终点),其余点的入度等于出度。

证明:与无向图证明类似,一个点进去多少次就要出来多少次。

模板嘛。。。

  1 /*
  2     不懂为什么dfs里的i加个&可以快这么多
  3 */
  4 #pragma comment(linker, "/STACK:102400000,102400000")
  5 #include <bits/stdc++.h>
  6 using namespace std;
  7 const int N=100005,M=500005;
  8 inline int read()
  9 {
 10     int s=0,f=0;
 11     char ch=' ';
 12     while(!isdigit(ch))
 13     {
 14         f|=(ch=='-');
 15         ch=getchar();
 16     }
 17     while(isdigit(ch))
 18     {
 19         s=(s<<3)+(s<<1)+(ch^48);
 20         ch=getchar();
 21     }
 22     return (f)?(-s):(s);
 23 }
 24 #define R(x) x=read()
 25 inline void write(int x)
 26 {
 27     if(x<0)
 28     {
 29         putchar('-');
 30         x=-x;
 31     }
 32     if(x<10)
 33     {
 34         putchar(x+'0');
 35         return;
 36     }
 37     write(x/10);
 38     putchar((x%10)+'0');
 39     return;
 40 }
 41 inline void writeln(int x)
 42 {
 43     write(x);
 44     putchar('\n');
 45     return;
 46 }
 47 #define W(x) write(x),putchar(' ')
 48 #define Wl(x) writeln(x)
 49 int n,m,T;
 50 int Indeg[N],Outdeg[N],Deg[N];
 51 namespace Oulahuilu
 52 {
 53     int tot=0,Next[M],to[M],head[N];
 54     bool Arr[M];
 55     inline void add(int x,int y)
 56     {
 57         Next[++tot]=head[x];
 58         to[tot]=y;
 59         head[x]=tot;
 60         return;
 61     }
 62     int Huilu[M],Huilu_cnt=0;
 63     inline void Run(int x)
 64     {
 65         for(int &i=head[x];i;i=Next[i]) if(!Arr[i])
 66         {
 67             int oo=i;
 68             Arr[i]=1;
 69             if(T==1)
 70             {
 71                 (i&1)?(Arr[i+1]=1):(Arr[i-1]=1);
 72             }
 73             Run(to[i]);
 74             Huilu[++Huilu_cnt]=oo;
 75         }
 76         return;
 77     }
 78     inline void Output()
 79     {
 80         int i;
 81         for(i=Huilu_cnt;i>=1;i--)
 82         {
 83             if(T==1)
 84             {
 85                 W(((Huilu[i]&1)?1:-1)*((Huilu[i]+1)/2));
 86             }
 87             else
 88             {
 89                 W(Huilu[i]);
 90             }
 91         }
 92         return;
 93     }
 94 }
 95 int main()
 96 {
 97 //    freopen("tour14.in","r",stdin);
 98 //    freopen("my.out","w",stdout);
 99     int i;
100     R(T);
101     R(n);
102     R(m);
103     if(T==1)
104     {
105
106         for(i=1;i<=m;i++)
107         {
108             int x,y;
109             R(x);
110             R(y);
111             Deg[x]++;
112             Deg[y]++;
113             Oulahuilu::add(x,y);
114             Oulahuilu::add(y,x);
115         }
116         for(i=1;i<=n;i++) if(Deg[i]&1)
117         {
118             return 0*puts("NO");
119         }
120         for(i=1;i<=n;i++) if(Oulahuilu::head[i])
121         {
122             Oulahuilu::Run(i);
123             break;
124         }
125         if(Oulahuilu::Huilu_cnt!=m)
126         {
127             puts("NO");
128         }
129         else
130         {
131             puts("YES");
132             Oulahuilu::Output();
133         }
134     }
135     else
136     {
137         for(i=1;i<=m;i++)
138         {
139             int x,y;
140             R(x);
141             R(y);
142             Outdeg[x]++;
143             Indeg[y]++;
144             Oulahuilu::add(x,y);
145         }
146         for(i=1;i<=n;i++) if(Indeg[i]!=Outdeg[i])
147         {
148             return 0*puts("NO");
149         }
150         for(i=1;i<=n;i++) if(Oulahuilu::head[i])
151         {
152             Oulahuilu::Run(i);
153             break;
154         }
155         if(Oulahuilu::Huilu_cnt!=m)
156         {
157             puts("NO");
158         }
159         else
160         {
161             puts("YES");
162             Oulahuilu::Output();
163         }
164     }
165     return 0;
166 }
167 /*
168 input
169 1
170 3 3
171 1 2
172 2 3
173 1 3
174 output
175 YES
176 1 2 -3
177
178 input
179 2
180 5 6
181 2 3
182 2 5
183 3 4
184 1 2
185 4 2
186 5 1
187 output
188 YES
189 4 1 3 5 2 6
190
191 input
192 2
193 100000 3
194 41700 41700
195 15415 31090
196 31090 15415
197 output
198 NO
199 */

View Code

转载于:https://www.cnblogs.com/gaojunonly1/p/10348777.html

一本通1527欧拉回路相关推荐

  1. 信息学奥赛一本通OJ勘误

    信息学奥赛一本通OJ 是面向信奥初学者的很好用的OJ,感谢网站作者的的耐心制作. 尽管如此,该网站还是有一些错误,在此指明.瑕不掩瑜,希望网站作者早日修正. 1198:逆波兰表达式 题目中概念错误,应 ...

  2. 《信息学奥赛一本通》提高版题单

    第一部分 基础算法 第 1 章 贪心算法 #10000 「一本通 1.1 例 1」活动安排 #10001 「一本通 1.1 例 2」种树 #10002 「一本通 1.1 例 3」喷水装置 #10003 ...

  3. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  4. 一本通提高篇之一句话系列

    [通知] 由于LL喜新厌旧另置新书,这篇博客目测,会无限咕下去 大概会在十月及以后再次拿起 [进度] 20/34 咿呀,还有14章了QwQ 我太蒻了 连一本通都没刷完 是分块哒(^~^) 例题解析请看 ...

  5. 一本通提高篇在线提交地址

    一本通提高篇 1 基础算法 1.1 贪心算法 1.1.1 P2018  [第一章例题1.1]活动安排正确: 9 提交: 17 比率: 52.94 % 1.1.2 P2021 [第一章例题1.2]种树正 ...

  6. 算法提高课——3.10 欧拉路径和欧拉回路

    欧拉路径和欧拉回路 哥尼斯堡七桥问题 以下内容摘自<信息学奥赛一本通·提高篇>. 欧拉回路问题是图论中最古老的问题之一.它诞生于18世纪的欧洲古城哥尼斯堡,普瑞格尔河流经这座城市,人们在两 ...

  7. [模板][持续更新]欧拉回路与欧拉路径浅析

    Luogu P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与 ...

  8. uoj 117 欧拉回路

    1.判断是否为欧拉存在欧拉回路---裸的判断 欧拉回路就是看一笔能不能把途中所有的边跑完没得重复 对于无向边----建立双向边判断每个点的入度是否为2的倍数   1.1 对于有向边---建立单向边判断 ...

  9. 图论--欧拉路,欧拉回路(小结)

    在题目中在慢慢细说概念 1.HDU - 3018 Ant Trip 题目大意:又N个村庄,M条道路.问须要走几次才干将全部的路遍历 解题思路:这题问的是有关欧拉路的判定 欧拉路就是每条边仅仅能走一次, ...

最新文章

  1. [项目过程中所遇到的各种问题记录]部署篇——项目部署过程中那些纠结的问题-SQLServer...
  2. linux nfs 读写性能,linux – Debian上的NFS性能问题
  3. Selenium常用API的使用java语言之7-控制浏览器操作
  4. *36.操作系统中磁盘的调度算法
  5. php 函数中静态变量的问题
  6. 如何学习挖掘漏洞[参考多方面资料]
  7. 在狮驼岭,孙悟空救了猪八戒,猪八戒为何不帮孙悟空?
  8. MyEclipse的build、clean、publish、clean(redeploy)的区别
  9. 深度学习助力异常胸部 X 光片检测
  10. visual c语言编译运行结果,Visual Studio 2015编译运行C语言文件问题小结
  11. 【原】 图片预览 Image preview
  12. Android设置Spinner控件的文字居中显示
  13. php ajax怎么拿id,php ajax无刷新分页,支持id定位
  14. CISSP考试要涨价了,5月1日起考试费涨为749美元
  15. 中国名人书画展由世界全媒体联盟中国区及广西明星影视文化传媒有限公司联合举办
  16. 不同颜色蔬菜代表什么营养?
  17. 配合理lcd的c语言小游戏,51单片机+LCD12864做的贪食蛇和俄罗斯方块小游戏分享
  18. android通知栏的点击事件,Android监听消息通知栏点击事件
  19. 关于pcl1.11.0无法找到 pcl/io/openni_grabber.h的解决办法
  20. 不让玩游戏的小娃娃随机考试系统

热门文章

  1. 花盆Flowerpot[USACO12MAR]
  2. 2020腾讯数分笔试
  3. 7-4 1.1.4 破碎的项链(USACO)
  4. Born近似和Rytov近似
  5. 【Tensorflow】 tf.equal(tf.argmax(y, 1),tf.argmax(y_, 1))用法
  6. tf.greater(a,b)
  7. BUUCTF:[安洵杯 2019]吹着贝斯扫二维码
  8. 某徒步旅游网站python爬虫小练习
  9. 电脑在登陆界面如何打开计算机管理,电脑打不开路由器管理界面怎么解决
  10. 夯实第一超市地位 京东超市成超10大品类超50家品牌线上最大渠道