UOJ 117 欧拉回路(套圈法+欧拉回路路径输出+骚操作)
题目链接: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 欧拉回路(套圈法+欧拉回路路径输出+骚操作)的更多相关文章
- UVA10054-The Necklace(无向图欧拉回路——套圈算法)
Problem UVA10054-The Necklace Time Limit: 3000 mSec Problem Description Input The input contains T t ...
- LOJ-10105(欧拉回路模板,套圈法,递归)
题目链接:传送门 思路: (1)用邻接表存储有向图和无向图,有向图和无向图的每条边均站两个单元,无向图有正向边和反向边的区分. (2)有向图有欧拉回路:所有点的入度=出度: 无向图有欧拉回路:所有点的 ...
- 暑假集训2016day3T1 欧拉回路(UOJ #117欧拉回路)(史上最全的欧拉回路纯无向图/有向图解析)
原题……可惜不会……真是一只大蒟蒻…… ———————————————————————————————— 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好 ...
- UOJ#117. 欧拉回路
#117. 欧拉回路 题目描述 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 这张图是有向图.(5 ...
- 【UOJ 117】欧拉回路
#117. 欧拉回路 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 输入格式 第一行一个整数 t, ...
- 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)
[UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...
- uva11549 Floyd判圈法
题意: 给两个数n, k,每次将k平方取k的前n位,问所有出现过的数的最大值 原来这就是floyd判圈法.. #include<cstdio> #include<cstdlib> ...
- 破圈法求解最小生成树c语言实现(已验证)
破圈法求解最小生成树c语言实现(已验证) 下面是算法伪代码,每一个算法都取一个图作为输入,并返回一个边集T. 对该算法,证明T是一棵最小生成树,或者证明T不是一棵最小生成树.此外,对于每个算法,无论它 ...
- POJ 2135.Farm Tour 消负圈法最小费用最大流
Evacuation Plan Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4914 Accepted: 1284 ...
随机推荐
- 转:WEB前端性能优化规则
14条规则摘自<High Performance Web Sites>,本文地址 1.减少Http请求 使用图片地图 使用CSS Sprites 合并JS和CSS文件 这个是由于浏览器对同 ...
- express 学习札记
Enjoy yourself! 祝你玩得开心! I have no idea. 我没有头绪. I just made it! 我做到了! I’ll see to it 我会留意的. Express ...
- ssh免密登陆权限问题
问题: 添加了authorized_keys还是不能免密登陆. 思路: 检查端口是否开放,是否允许root用户登录,尝试重启ssh服务... 最有可能的还是权限问题,出现Permission deni ...
- [剑指offer]51-数组中的逆序对(归并排序)
题目链接 https://www.nowcoder.com/questionTerminal/96bd6684e04a44eb80e6a68efc0ec6c5 题意 在数组中的两个数字,如果前面一个数 ...
- [leetcode]210. Course Schedule II课程表II
There are a total of n courses you have to take, labeled from 0 to n-1. Some courses may have prereq ...
- [leetcode]428. Serialize and Deserialize N-ary Tree序列化与反序列化N叉树
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [leetcode]101. Symmetric Tree对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- AngularJS——第2章 模块化
第2章 模块化 使用AngularJS构建应用时是以模块化的方式组织的,即将整个应用划分成多个小模块,各个模块有各自的职责,最终实现完整的应用. 2.1 定义应用 通过为任一HTML标签添加ng-ap ...
- how2j网站前端项目——天猫前端(第一次)学习笔记7
开始学习结算页面 结算页面分为3个部分学习:1.简单的头部和收货地址 2.较为复杂的确认订单信息 3.交互 一.简单的头部和收货地址 根据站长的图片,自己模仿着做了一下,刚开始没有想到填写信息的4个框 ...
- 44-java断点调式dubug
转自:https://www.cnblogs.com/mq0036/p/3780538.html Eclipse 的单步调试 1.设置断点在程序里面放置一个断点,也就是双击需要放置断点的程序左边的栏目 ...