SP211 PRIMIT - Primitivus recurencis(欧拉回路)
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(欧拉回路)的更多相关文章
- ACM/ICPC 之 混合图的欧拉回路判定-网络流(POJ1637)
//网络流判定混合图欧拉回路 //通过网络流使得各点的出入度相同则possible,否则impossible //残留网络的权值为可改变方向的次数,即n个双向边则有n次 //Time:157Ms Me ...
- [poj2337]求字典序最小欧拉回路
注意:找出一条欧拉回路,与判定这个图能不能一笔联通...是不同的概念 c++奇怪的编译规则...生不如死啊... string怎么用啊...cincout来救? 可以直接.length()我也是长见识 ...
- ACM: FZU 2112 Tickets - 欧拉回路 - 并查集
FZU 2112 Tickets Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u P ...
- UVA 10054 the necklace 欧拉回路
有n个珠子,每颗珠子有左右两边两种颜色,颜色有1~50种,问你能不能把这些珠子按照相接的地方颜色相同串成一个环. 可以认为有50个点,用n条边它们相连,问你能不能找出包含所有边的欧拉回路 首先判断是否 ...
- POJ 1637 混合图的欧拉回路判定
题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...
- codeforces 723E (欧拉回路)
Problem One-Way Reform 题目大意 给一张n个点,m条边的无向图,要求给每条边定一个方向,使得最多的点入度等于出度,要求输出方案. 解题分析 最多点的数量就是入度为偶数的点. 将入 ...
- UVa 12118 检查员的难题(dfs+欧拉回路)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 10054 (欧拉回路) The Necklace
题目:这里 题意:有一种由彩色珠子连接而成的项链,每个珠子两半由不同颜色(由1到50的数字表示颜色)组成,相邻的两个珠子在接触的地方颜色相同,现在有一些零碎的珠子,确认它是否能 复原成完整的项链. 把 ...
- poj2513Colored Sticks(无向图的欧拉回路)
/* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...
随机推荐
- Saltstack生产案例之Haproxy安装
cd /srv/salt/prod/ mkdir haproxymkdir keepalivedmkdir nginxmkdir phpmkdir memcachedmkdir pkg cd pkg ...
- a new way of thinking about a problem
PHP Advanced and Object-Oriented Programming Larry Ullman The first thing that you must understand ...
- go语言编程入门
查看文档 首先先分享一个可以在本地就能查看文档的骚操作(linux系统) 1.打开命令行终端,输入godoc -http=:8000,如果想后台运行在后面加个& 2.然后打开浏览器,输入网址: ...
- 《Mysql 索引》
一:索引概述? - 数据库里的数据是以文件的形式存储的,里面放了我们的各种数据.就和一本书一样. - 通俗的来说,索引就像一个书签一样,可以直接帮我们找到内容,避免了我们一页一页找. - 就像你不会给 ...
- 几种常见web攻击手段及其防御方式
XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS web安全系列目录 总结几种常见web攻击手段极其防御方式 总结几种常见的安全算法 XSS 概念 全称是跨站脚本攻击(Cross ...
- 【Python】Pycharm2018激活方式【亲测好用】
2.激活码激活 优点:Window.Mac.Ubantu都稳定有效,关键是这种激活方式不会产生其他影响 缺点:需要修改hosts文件 修改hosts文件将0.0.0.0 account.jetbrai ...
- 【Python】xpath中为什么粘贴进去代码后老报错?如何在定位元素的时候准确找到定位切入点?
1. xpath后()中双引号("")里面不能套用双引号(""),把里面的双引号改成单引号('')报错就没有了. 2.如何在定位元素的时候准确找到定位切入点? ...
- SparkSQL UDF使用方法与原理详解
UDF是SQL中很常见的功能,但在Spark-1.6及之前的版本,只能创建临时UDF,不支持创建持久化的UDF,除非修改Spark源码.从Spark-2.0开始,SparkSQL终于支持持久化的UDF ...
- tomcat上部署CGI
CGI的定义是:外部应用程序与Web服务器之间的接口. 1.Tomcat7支持CGI,但是默认配置是关闭的需要进行如下配置 修改Tomcat conf/web.xml中两处代码,默认是注释掉的,去掉注 ...
- Oracal 11 g 数据库安装
一:下载安装包 http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/112010-win64soft- ...