poj 2230 Watchcow(欧拉回路)
2024-09-23 03:39:50
关键是每条边必须走两遍,重复建边即可,因为确定了必然存在 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 ;
}
最新文章
- 高性能的JavaScript--数据访问(2)
- Mathematica 中 Minimize函数无法找到全局最小值时的解决方法
- C++ (P70—P96)
- C#冒泡排序法程序代码
- phpmyadmin密码字段加密方法
- 23种设计模式的C++实现
- java 局部变量几点笔记
- JavaScript Base64加解密
- 基于epoll实现简单的web服务器
- hdu 1255 覆盖的面积(求覆盖至少两次以上的面积)
- 删除链表倒数第n个节点
- node读取文件转换json文件
- PHP通过身份证号码获取性别、出生日期、年龄等信息
- Aizu2130-Billion Million Thousand-dp
- Fastjson 实体类JSON化过滤字段操作-PropertyFilter
- JavaBean和List<;JavaBean>;
- keys(),values()和items()
- Yii2 数据操作Query Builder查询数据
- Hadoop基础-MapReduce的Join操作
- HDU 4453 Looploop (伸展树splay tree)