关键是每条边必须走两遍,重复建边即可,因为确定了必然存在 Euler Circuit ,所以所有判断条件都不需要了。

注意:我是2500ms跑过的,鉴于这道题ac的code奇短,速度奇快,考虑解法应该不唯一。

 #include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define clr(a,m) memset(a,m,sizeof(a))
using namespace std; const int MAXN=;
const int MAXM=; struct Edge{
int v,next,vis;
Edge(){}
Edge(int _v,int _next):v(_v),next(_next),vis(){}
}edge[MAXM<<]; stack<int>stk;
int head[MAXN],tol;
int degree[MAXN]; void init()
{
tol=;
clr(head,-);
} void add(int u,int v)
{
edge[tol]=Edge(v,head[u]);
head[u]=tol++; edge[tol]=Edge(u,head[v]);
head[v]=tol++;
} void FindEuler(int u)
{
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v; if(!edge[i].vis){
edge[i].vis=edge[i^].vis=;
FindEuler(v);
stk.push(v);
}
}
} void EulerCircuit(int n)
{
while(!stk.empty())
stk.pop();
FindEuler();
} int main()
{
int n,m,x,y;
scanf("%d%d",&n,&m); init();
clr(degree,);
rep(i,,m-){
scanf("%d%d",&x,&y);
x--;y--;
add(x,y);
add(x,y);
degree[x]+=;
degree[y]+=;
} EulerCircuit(n);
stk.push();
while(!stk.empty())
{
x=stk.top();stk.pop();
printf("%d\n",x+);
}
return ;
}

最新文章

  1. 高性能的JavaScript--数据访问(2)
  2. Mathematica 中 Minimize函数无法找到全局最小值时的解决方法
  3. C++ (P70—P96)
  4. C#冒泡排序法程序代码
  5. phpmyadmin密码字段加密方法
  6. 23种设计模式的C++实现
  7. java 局部变量几点笔记
  8. JavaScript Base64加解密
  9. 基于epoll实现简单的web服务器
  10. hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
  11. 删除链表倒数第n个节点
  12. node读取文件转换json文件
  13. PHP通过身份证号码获取性别、出生日期、年龄等信息
  14. Aizu2130-Billion Million Thousand-dp
  15. Fastjson 实体类JSON化过滤字段操作-PropertyFilter
  16. JavaBean和List&lt;JavaBean&gt;
  17. keys(),values()和items()
  18. Yii2 数据操作Query Builder查询数据
  19. Hadoop基础-MapReduce的Join操作
  20. HDU 4453 Looploop (伸展树splay tree)

热门文章

  1. ViewController 优化
  2. C++排序函数sort/qsort使用
  3. 解Linux进程间通信(IPC)方式
  4. unity3d结合轮廓显示,实现完整的框选目标(附Demo代码)
  5. 如何用 ANTLR 4 实现自己的脚本语言?
  6. StringTokenizer用法
  7. cf div2 235 D
  8. POJ 1795
  9. SGU 114
  10. LOGSTASH再入门第一发