SP211 PRIMIT - Primitivus recurencis

欧拉回路

Warning: enormous Input/Output data

警告:巨大的输入/输出

经过若干(11)次提交后,我终于明白了,真的要把数组开大。


题意: 给定 t 组数据,每组数据有n条有向边(对,没给范围),每个点的编号<=1000。

打印一串最短的数列包括所有有向边

这是满足样例的一组解:(8, 5, 1, 4, 2, 3, 9, 6, 4, 5, 7, 6, 2, 8, 6)


分析样例发现,编号为2,4,8的3个点是奇点(此处指出度>入度的点)。而答案为15=12+3=边数+奇点数

我们就可以联想到欧拉回路。

你需要知道一件事:对于每个满足欧拉回路性质的图,不管你怎么走,总能一次性把所有边走一遍。(自寻死路不算qwq)

而满足样例的一组解可拆分为:(8, 5, 1, 4, 2, 3, 9, 6)  (4, 5, 7, 6)  (2, 8, 6)

显然走了3次,起点为8,4,2。

答案就十分显然了。


不,并没有结束。因为我们忽略了图的连通性和没有奇点的图。

对于没有奇点的图,显然我们要走一次,数列长度为 边数+1

我们可以用dfs把以上情况一起处理掉。

注意dfs只需要把点遍历一遍,而不用遍历边(会T掉),原因见上↑

(这种冷门题没人看得见吧QAQ)

code:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
template <typename T> inline T max(T &a,T &b) {return a>b ?a:b;}
template <typename T> inline void read(T &x){
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=(x<<)+(x<<)+(c^),c=getchar();
}
template <typename T> inline void output(T x){
if(!x) {putchar(); return ;}
int wt[],l=;
while(x) wt[++l]=x%,x/=;
while(l) putchar(wt[l--]+);
}
int t[],ans,mxd,n,tt,u,v,_top,st[];
int cnt,hd[],nxt[],ed[],poi[];//尽量开大
bool vis[],appear[];
inline void add(int x,int y){ //邻接表
nxt[ed[x]]=++cnt; hd[x]= hd[x] ? hd[x]:cnt;
ed[x]=cnt; poi[cnt]=y; ++t[x]; --t[y];
}
inline void dfs(int u){ //dfs遍历点
vis[u]=;
for(int i=hd[u];i;i=nxt[i])
if(!vis[poi[i]])
dfs(poi[i]);
}
int main(){
scanf("%d",&tt);
while(tt--){
memset(appear,,sizeof(appear)); //该清空的都清空一遍
memset(vis,,sizeof(vis));
memset(t,,sizeof(t));
memset(hd,,sizeof(hd));
memset(nxt,,sizeof(nxt));
memset(ed,,sizeof(ed));
memset(poi,,sizeof(poi));
read(n); ans=n; mxd=cnt=; //边数是固定的,可以提出来
for(int i=;i<=n;++i){
read(u); read(v);
mxd=max(mxd,max(u,v));
add(u,v);
appear[u]=appear[v]=;
}
for(int i=;i<=mxd;++i) if(t[i]>) ans+=t[i],dfs(i); //有奇点的图
for(int i=;i<=mxd;++i) if(!vis[i]&&appear[i]) dfs(i),++ans; //没有奇点的图
output(ans); putchar('\n');
}return ;
}

SP211 PRIMIT - Primitivus recurencis(欧拉回路)的更多相关文章

  1. ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)

    //网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...

  2. [poj2337]求字典序最小欧拉回路

    注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...

  3. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

  4. UVA 10054 the necklace 欧拉回路

    有n个珠子,每颗珠子有左右两边两种颜色,颜色有1~50种,问你能不能把这些珠子按照相接的地方颜色相同串成一个环. 可以认为有50个点,用n条边它们相连,问你能不能找出包含所有边的欧拉回路 首先判断是否 ...

  5. POJ 1637 混合图的欧拉回路判定

    题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...

  6. codeforces 723E (欧拉回路)

    Problem One-Way Reform 题目大意 给一张n个点,m条边的无向图,要求给每条边定一个方向,使得最多的点入度等于出度,要求输出方案. 解题分析 最多点的数量就是入度为偶数的点. 将入 ...

  7. UVa 12118 检查员的难题(dfs+欧拉回路)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. UVA 10054 (欧拉回路) The Necklace

    题目:这里 题意:有一种由彩色珠子连接而成的项链,每个珠子两半由不同颜色(由1到50的数字表示颜色)组成,相邻的两个珠子在接触的地方颜色相同,现在有一些零碎的珠子,确认它是否能 复原成完整的项链. 把 ...

  9. poj2513Colored Sticks(无向图的欧拉回路)

    /* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...

随机推荐

  1. Docker 学习应用篇三:使用docker搭建的环境,安装thinksns

    Thinksns 是一个开源的社交网站,因为目前的项目需要用到这个,所以就下载一个安装试试看. 之前在windows上用了wamp,安装的很顺利.但是项目是要部署到linux上的.于是我便用了Dock ...

  2. POJ-2329 Nearest number - 2(BFS)

    Nearest number - 2 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4100 Accepted: 1275 De ...

  3. poj1182 食物链【并查集-好题!】

    动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A.  现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两 ...

  4. linux 启动过程关键点

    Freeing init memory: 4568K init...   Freeing init memory 后,就是开始init进程

  5. create view in view

    CREATE VIEW view_region2role AS ( SELECT region_set_id, region_set_name, GROUP_CONCAT(id) gc_id, GRO ...

  6. 网络解析(一):LeNet-5详解

    https://cuijiahua.com/blog/2018/01/dl_3.html 一.前言 LeNet-5出自论文Gradient-Based Learning Applied to Docu ...

  7. vs code 设置工作区背景图片方法

    1.扩展--安装background 2.文件--首选项--设置--在settings.josn中编辑--右侧用户设置添加 "background.useFront": false ...

  8. js实现点击div以外区域,隐藏div区域

    <body style="text-align:center;"> <input type="text" style="width: ...

  9. 洛谷P2602 数字计数 [ZJOI2010] 数位dp

    正解:数位dp 解题报告: 传送门! 打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪 ...

  10. CSS3实现背景透明,文字不透明

    最近遇到一个需求,要在图片上显示带有半透明背景的文字,效果如下图所示: 看到这个需求之后,第一反应是使用CSS3中的opacity设置元素的透明度. <!DOCTYPE html> < ...