题目大意

就是让你对有向图和无向图分别求欧拉回路

非常的模板,但是由于UOJ上毒瘤群众太多了

所以你必须加上一个小优化

就是每次访问过一个边就把它删掉

有点像Dinic的当前弧优化的感觉

注意是在dfs完一个节点把当前的边加入到栈里面

然后输出的时候为了保证原来的顺序就直接弹栈就好了

//Author: dream_maker

#include

using namespace std;

//----------------------------------------------

typedef pair pi;

typedef long long ll;

typedef double db;

#define fi first

#define se second

#define fu(a, b, c) for (int a = b; a <= c; ++a)

#define fd(a, b, c) for (int a = b; a >= c; --a)

#define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)

const int INF_of_int = 1e9;

const ll INF_of_ll = 1e18;

template

void Read(T &x) {

bool w = 1;x = 0;

char c = getchar();

while (!isdigit(c) && c != '-') c = getchar();

if (c == '-') w = 0, c = getchar();

while (isdigit(c)) {

x = (x<<1) + (x<<3) + c -'0';

c = getchar();

}

if (!w) x = -x;

}

template

void Write(T x) {

if (x < 0) {

putchar('-');

x = -x;

}

if (x > 9) Write(x / 10);

putchar(x % 10 + '0');

}

//----------------------------------------------

const int N = 4e5 + 10;

struct Edge {

int v, id, nxt;

} E[N];

int head[N], tot = 0;

int fro[N], to[N], n, m;

void addedge(int u, int v, int id) {

E[++tot] = (Edge) {v, id, head[u]};

head[u] = tot;

}

namespace Solve1 {

int du[N], vis[N];

stack st;

void dfs(int u) {

for (int &i = head[u]; i; i = E[i].nxt) {

int cur = i;

if (vis[abs(E[cur].id)]) continue;

vis[abs(E[cur].id)] = 1;

dfs(E[cur].v);

st.push(E[cur].id);

}

}

void solve() {

fu(i, 1, m) ++du[fro[i]], ++du[to[i]];

fu(i, 1, n) if (du[i] & 1) {

printf("NO");

return;

}

fu(i, 1, m) {

addedge(fro[i], to[i], i);

addedge(to[i], fro[i], -i);

}

fd(i, n, 1) {

if (head[i]) {

dfs(i);

break;

}

}

if ((signed) st.size() != m) {

printf("NO");

} else {

printf("YES\n");

while (st.size()) {

Write(st.top()), putchar(' ');

st.pop();

}

}

}

}

namespace Solve2 {

int in[N], out[N], vis[N];

stack st;

void dfs(int u) {

for (int &i = head[u]; i; i = E[i].nxt) {

int cur = i;

if (vis[E[cur].id]) continue;

vis[E[cur].id] = 1;

dfs(E[cur].v);

st.push(E[cur].id);

}

}

void solve() {

fu(i, 1, m) ++out[fro[i]], ++in[to[i]];

fu(i, 1, n) if (out[i] ^ in[i]) {

printf("NO");

return;

}

fu(i, 1, m) addedge(fro[i], to[i], i);

fu(i, 1, n) {

if (head[i]) {

dfs(i);

break;

}

}

if ((signed) st.size() != m) {

printf("NO");

} else {

printf("YES\n");

while (st.size()) {

Write(st.top()), putchar(' ');

st.pop();

}

}

}

}

int main() {

#ifdef dream_maker

freopen("input.txt", "r", stdin);

#endif

int op; Read(op);

Read(n), Read(m);

fu(i, 1, m) Read(fro[i]), Read(to[i]);

if (op == 1) Solve1::solve();

else Solve2::solve();

return 0;

}

欧拉回路c语言程序,UOJ117. 欧拉回路【欧拉回路模板题】相关推荐

  1. 《C语言程序教程》课后编程题

    1.3编程题 1.试参考本章例题编写计算梯形面积的C语言程序,梯形的上底.下底和高分别用a.b.h表示,并用a=10,b=20,h=5测试所编写的程序. #include <stdio.h> ...

  2. c语言程序实训报告模板,C语言实训报告模板..doc

    C语言实训报告模板. Shanghai Dianji University 实训报告 课程名称: 计算机能力强化实训(C) 姓 名: 班级学号: BG0802 指导教师: 吉顺如 完成日期: 2010 ...

  3. c语言程序100例第5题

    #define _CRT_SECURE_NO_WARNINGS#include <stdlib.h> #include <stdio.h>/* 题目:输入三个整数 x,y,z, ...

  4. c语言程序100例第4题 参考了参考答案

    题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天, 特殊 情况,闰年且输入月份大于 3 时需考虑多 ...

  5. 中国海洋大学c语言上机作业,中国海洋大学c语言程序2015春季学期上机题考试题及答案.doc...

    资源描述: 1C程序设计课程期末上机考试考试时间50分钟考试方式从下面的20题中随机抽取一题,再附加一题,共需完成2道题.附加题不事先给定分值分配第一题60分,第二题40分,共100分考试时间2015 ...

  6. C语言程序初体验第五题

    题目描述 输入两个整数,进行加法.减法.乘法的运算并输出结果.比如:输入a,b,进行a+b,a-b,a*b的运算,输出他们的计算结果. 输入 两个整数的值 输出 这两个整数加的结果 这两个整数减的结果 ...

  7. 经典C语言程序100例之八

    经典C语言程序100例之八 如题 话不多说了,直接上代码 如题 [程序8] 题目:输出9*9口诀. 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列. 话不多说了,直接上代码 2.程序源代码 ...

  8. 经典C语言程序100例之七

    经典C语言程序100例之七 如题 话不多说了,直接上代码 如题 [程序7] 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个.不同字符,图形 ...

  9. 经典C语言程序100例之六

    经典C语言程序100例之六 如题 话不多说了,直接上代码 如题 [程序6] 题目:用号输出字母C的图案. 1.程序分析:可先用''号在纸上写出字母C,再分行输出. 话不多说了,直接上代码 2.程序源代 ...

最新文章

  1. boost::unorder_map如何插入元素_「React」如何在React中优雅的实现动画
  2. android 5秒后进入,Android/Java:如何在5秒后停止下载?
  3. 数据挖掘导论读书笔记2
  4. 专家点评Science | 朱冰/许瑞明合作团队报道CpG岛结合蛋白BEND3作用机制
  5. 周期均方根和有效值的区别_买羊肉,“羔羊肉”和“羊肉”有啥区别?口感差别大,别再乱买了...
  6. JavaScript中一个对象如何继承另外一个对象
  7. win10+Vmware14+Centeros7.6 mini网络设置
  8. endnote 参考文献加序号_EndNote同一文章的插入不同编号参考文献的方法 | 科研动力...
  9. 大漠插件ocr多选字库_大漠ocr识别字库的生成,和使用方法
  10. h5页面 请在微信客户端打开链接_完美解决 请在微信客户端打开链接
  11. Open cv的Canny边缘检测和轮廓检测例子
  12. 探索永无止境 万洲金业荣膺GMCA第三届蝉鸣奖“年度最具创新力奖”
  13. processing作业:画有五角星绕圈的国旗(此例:塔吉克斯坦共和国国旗)
  14. windows使用docker部署gitlab
  15. 使用lightGBM进行验证的demo
  16. 君正平台JZ4775芯片参数详细说明,大家可以看看
  17. 离散数学笔记_第一章:逻辑和证明(2 )
  18. 计算机辅助设计 王茹,《计算机辅助设计》王茹.pdf
  19. dammit! (靠!)
  20. Qt5笔记之Qt5插件的生成与加载及json文件的读取

热门文章

  1. STM8S0 TIM1_PWM互补输出
  2. Cardboard XR Plugin For Unity
  3. vue原理:vue中是如何监听数组变化?
  4. 可量产AR主机来了!搭载骁龙XR2+,续航是手机方案2倍以上
  5. string库的简介和使用
  6. Python post请求模拟登录淘宝并爬取商品列表!
  7. cos(a+b)的展开证明
  8. linux传输文件特别慢,加快Linux文件拷贝速度的两大方法
  9. mysql如何查询是否大小写敏感_MySQL查询大小写是否敏感问题分析
  10. java四大作用域_java的四大作用域是什么?