题目链接:http://uoj.ac/problem/117

题目大意:

解题思路:先判断度数:

     若G为有向图,欧拉回路的点的出度等于入度。

     若G为无向图,欧拉回路的点的度数位偶数。

     然后判断连通性,并且输出路径需要用套圈法(其实我也不是很懂)。

     还学了一些骚操作:

     ①用链式前向星存图,如果是有向图,那idx隔两个存一条边,如果是无向图则idx隔一个存一条边,且idx从2开始。这样写的作用就是在寻无向图路径时可以良好地标记,比如第一条无向边里idx=2、3分别对应一条正反边,2和3除2都对应1,那么我们只需标记vis[1]就好了,因为欧拉回路只需要用到其中一条边。有向图因为要防止两条当一条用,所以要idx要隔2存一条边。

     ②在遍历邻接表时j加一个引用,快了超多。

代码:

 #include<iostream>
#include<stack>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
const int M=2e5+; struct node{
int to,next,w;
}edge[M*]; int n,m,idx,cnt;
int head[N],in_deg[N],out_deg[N],ans[N];
bool vis[M*]; void init(){
idx=;
memset(vis,false,sizeof(vis));
memset(head,,sizeof(head));
memset(in_deg,,sizeof(in_deg));
memset(out_deg,,sizeof(out_deg));
} void addedge(int u,int v,int w){
edge[idx].to=v;
edge[idx].next=head[u];
edge[idx].w=w;
head[u]=idx++;
} //传说中的套圈法,输出欧拉回路路径
void dfs(int u){
//这个引用好神奇啊,速度快了好多,学习了0 0
//好像类似于网络流的cur优化(没学过网路流,瞎说的)
//然后关于idx的处理也很巧妙
for(int &j=head[u];j;j=edge[j].next){
node t=edge[j];
if(!vis[j>>]){
vis[j>>]=true;
dfs(t.to);
ans[++cnt]=t.w;
}
}
} int main(){
int t;
scanf("%d%d%d",&t,&n,&m);
init();
int a,b;
for(int i=;i<=m;i++){
scanf("%d%d",&a,&b);
addedge(a,b,i);
in_deg[b]++;
out_deg[a]++;
if(t==)
addedge(b,a,-i);
else
idx++;
}
bool flag=true;
if(t==){
for(int i=;i<=n;i++){
if((in_deg[i]+out_deg[i])%){
flag=false;
break;
}
}
}
else{
for(int i=;i<=n;i++){
if(in_deg[i]!=out_deg[i]){
flag=false;
break;
}
}
}
if(flag){
dfs(a);
if(cnt!=m)
puts("NO");
else{
puts("YES");
for(int i=cnt;i>=;i--){
if(i==)
printf("%d\n",ans[i]);
else
printf("%d ",ans[i]);
}
}
}
else
puts("NO");
return ;
}

UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)的更多相关文章

  1. UVA10054-The Necklace(无向图欧拉回路——套圈算法)

    Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...

  2. LOJ-10105(欧拉回路模板,套圈法,递归)

    题目链接:传送门 思路: (1)用邻接表存储有向图和无向图,有向图和无向图的每条边均站两个单元,无向图有正向边和反向边的区分. (2)有向图有欧拉回路:所有点的入度=出度: 无向图有欧拉回路:所有点的 ...

  3. 暑假集训2016day3T1 欧拉回路(UOJ #117欧拉回路)(史上最全的欧拉回路纯无向图/有向图解析)

    原题……可惜不会……真是一只大蒟蒻…… ———————————————————————————————— 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好 ...

  4. UOJ#117. 欧拉回路

    #117. 欧拉回路 题目描述 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 这张图是有向图.(5 ...

  5. 【UOJ 117】欧拉回路

    #117. 欧拉回路 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 输入格式 第一行一个整数 t, ...

  6. 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)

    [UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...

  7. uva11549 Floyd判圈法

    题意: 给两个数n, k,每次将k平方取k的前n位,问所有出现过的数的最大值 原来这就是floyd判圈法.. #include<cstdio> #include<cstdlib> ...

  8. 破圈法求解最小生成树c语言实现(已验证)

    破圈法求解最小生成树c语言实现(已验证) 下面是算法伪代码,每一个算法都取一个图作为输入,并返回一个边集T. 对该算法,证明T是一棵最小生成树,或者证明T不是一棵最小生成树.此外,对于每个算法,无论它 ...

  9. POJ 2135.Farm Tour 消负圈法最小费用最大流

    Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4914   Accepted: 1284   ...

随机推荐

  1. 微信小程序接入百度统计

    一. 百度统计添加应用,获取appkey和微信小程序统计sdk: 1. 百度统计首页,点击“我的全部应用”右侧的添加按钮: 2. “应用类型”选择小程序统计,选择微信小程序,填写应用名称信息,选择内容 ...

  2. C++编译中的内存分配

    一个由 C/C++ 编译的程序占用的内存分为以下五个部分 代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的. 数据区:存放已初始化的全局变量.静态变量(全局和局部).常量数据. BBS区 ...

  3. java 基础之--java动态代理

    1.抽象角色:声明真实对象与代理对象的共同接口: 2.代理角色:相当于中介的作用,bridge,内部包含对真实角色的reference,在执行真实操作对象时,附加其他操作,相当于对真实角色的封装: 3 ...

  4. MVC中的七层架构

    工厂模式的七层架构 1.创建Model,实现业务实体. 2.创建IDAL,实现接口. 3.创建DAL,实现接口里的方法. 4.创建DBUtility,数据库操作类5.创建DALFactory,抽象工程 ...

  5. 同一台主机部署两个比特币钱包以及rpc服务的摘要

    .bitcoin QA Test环境 启动指定参数: "C:\Program Files (x86)\Bitcoin\bitcoin-qt.exe" -testnet -serve ...

  6. Oracle_SQL(1) 基本查询

    1.oracle的安装与卸载 2.PL/SQL Developer的安装 3.登陆PL/SQL Developer 4.SCOTT用户下表的介绍 5.基本查询语句 查询雇员的所有信息: select ...

  7. 安卓个性化 Button

    1.加入属性 android:background="@drawable/btn_selector" 2.drawable 下创建btn_selector.xml <?xml ...

  8. Latex基本用法

    空格 需要使用 \qquad,\quad,\,应该是占位符和变量之间需要有{}相隔. $$ C_{1} \qquad {C_2} $$ $$ C_{1} \quad {C_2} $$ $$ C_{1} ...

  9. Scrapy-Redis分布式策略

    Scrapy-Redis分布式策略 原理图: 假设有四台电脑:Windows 10.Mac OS X.Ubuntu 16.04.CentOS 7.2,任意一台电脑都可以作为 Master端 或 Sla ...

  10. SQL Server 2008重新保存表时出错

    在使用SQL Server 2008时,修改了表的字段名和类型名之后,点击保存按钮之后出现如下对话框: