蓝书3.7 欧拉回路
T1 欧拉回路 hdu 1878
题目大意:
判断是否存在欧拉回路
思路:
一个无向图存在欧拉回路的条件为所有点的度为偶数 且图联通
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #define ll long long 10 #define inf 2139062143 11 #define MAXN 10100 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int n,m,fa[MAXN],fst[MAXN],nxt[MAXN<<3],to[MAXN<<3],d[MAXN],cnt; 21 void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,d[v]++;} 22 int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} 23 void merge(int a,int b) {int f1=find(a),f2=find(b);if(f1!=f2) fa[f1]=f2;} 24 int main() 25 { 26 while(1) 27 { 28 n=read();if(!n) break; 29 m=read();int a,b; 30 memset(d,0,sizeof(d));memset(fst,0,sizeof(fst));cnt=0; 31 for(int i=1;i<=n;i++) fa[i]=i; 32 while(m--) {a=read(),b=read();add(a,b);add(b,a);merge(a,b);} 33 for(int i=1;i<n;i++) if(find(i)!=find(i+1)) {puts("0");goto ed;} 34 for(int i=1;i<=n;i++) if(d[i]&1) {puts("0");goto ed;} 35 puts("1"); 36 ed:; 37 } 38 }
View Code
T2 Ant Trip hdu 3018
题目大意:
最少次一笔画可以遍历所有边
思路:
独立的点对答案没有贡献
每个联通块如果奇数度的点等于0 ans+1
大于0 ans+=奇数点数/2
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #define ll long long 10 #define inf 2139062143 11 #define MAXN 100100 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int n,m,fa[MAXN],fst[MAXN],nxt[MAXN<<2],to[MAXN<<2],d[MAXN],cnt,ans,sz[MAXN],k[MAXN]; 21 void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,d[v]++;} 22 int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} 23 void merge(int a,int b) {int f1=find(a),f2=find(b);if(f1!=f2) fa[f1]=f2;sz[f2]+=sz[f1];} 24 int main() 25 { 26 int a,b; 27 while(scanf("%d%d",&n,&m)==2) 28 { 29 memset(d,0,sizeof(d));memset(fst,0,sizeof(fst)); 30 memset(k,0,sizeof(k));memset(sz,0,sizeof(sz));ans=cnt=0; 31 for(int i=1;i<=n;i++) fa[i]=i; 32 while(m--) {a=read(),b=read();add(a,b);add(b,a);merge(a,b);} 33 for(int i=1;i<=n;i++) sz[find(i)]++; 34 for(int i=1;i<=n;i++) if(d[i]&1) k[find(i)]++; 35 for(int i=1;i<=n;i++) if(fa[i]==i&&sz[i]>1) ans+=k[i]?k[i]>>1:1; 36 printf("%d\n",ans); 37 } 38 }
View Code
T3 John‘s Trip poj 1041
题目大意:
求图中是否存在欧拉回路 并求出任意一个欧拉回路
思路:
判欧拉回路就用度数判一下
然后dfs就行了
但是改变了dfs和把边加入栈的顺序 就wa了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #define ll long long 10 #define inf 2139062143 11 #define MAXN 5010 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int rt,n,m,to[MAXN],e[45][MAXN],d[MAXN],cnt,st[MAXN],top,vis[MAXN]; 21 void dfs(int x) 22 { 23 for(int i=1;i<=cnt;i++) 24 if(!vis[i]&&e[x][i]) {vis[i]=1;dfs(e[x][i]);st[++top]=i;} 25 } 26 void solve() 27 { 28 for(int i=1;i<=45;i++) if(d[i]&1) {puts("Round trip does not exist.");return;} 29 dfs(rt); 30 for(int i=top;i>1;i--) printf("%d ",st[i]); 31 printf("%d\n",st[1]); 32 } 33 int main() 34 { 35 int a,b,c;rt; 36 while(scanf("%d%d",&a,&b)) 37 { 38 if(!a&&!b) break;rt=min(a,b),c=read(),e[a][c]=b,e[b][c]=a,d[a]++,d[b]++,cnt++; 39 while(scanf("%d%d",&a,&b)) 40 {if(!a&&!b) {solve();break;}c=read(),e[a][c]=b,e[b][c]=a,d[a]++,d[b]++,cnt++;} 41 memset(e,0,sizeof(e));memset(d,0,sizeof(d));cnt=top=0; 42 memset(vis,0,sizeof(vis)); 43 } 44 }
View Code
T4 太鼓达人 bzoj 3033
题目大意:
给定k 求最长长度的01串
把这个串变成环 使这个环所有长度为k的子串互不相同
输出这个串的最长长度 并输出字典序最小的串
思路:
可以发现有1<<k个不同的串
使用dfs搜索 爆搜能过的原因是因为原图是一个欧拉图
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #define ll long long 10 #define inf 2139062143 11 #define MAXN 6010 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int n,t,vis[MAXN],ans[MAXN]; 21 int dfs(int x,int cnt) 22 { 23 if(vis[x]) return 0;if(cnt==t) return 1; 24 ans[cnt]=x&1,vis[x]=1; 25 if(dfs((x<<1)%t,cnt+1)) return 1; 26 if(dfs((x<<1|1)%t,cnt+1)) return 1; 27 vis[x]=0;return 0; 28 } 29 int main() 30 { 31 n=read();printf("%d ",t=1<<n); 32 for(int i=1;i<n;i++) printf("0"); 33 dfs(0,1);for(int i=1;i<=t-n+1;i++) printf("%d",ans[i]); 34 }
View Code
转载于:https://www.cnblogs.com/yyc-jack-0920/p/9378234.html
蓝书3.7 欧拉回路相关推荐
- 刘汝佳蓝书后缀数组模板解释及补全
相信很多初学后缀数组的ACMer在学习蓝书中的后缀数组部分遇到了一些障碍,可能像我一样看明白了P219 --220的讲解和算法,百度了基数排序的方法,然后被卡在P221的代码上了,本文目的即分享我对这 ...
- 对刘汝佳蓝书点双连通分量(BCC)模板的理解
/*经过简单的使用,对刘汝佳的这个板做几个简单的说明:1.算法结束后每个bcc[i]里存入一个双连通分量的点的标号,其中割点也被存进去,也就是说割点可以属于多个双连通分量2.根据刘汝佳所说的点-双连通 ...
- 牛客 美团编程真题 MT1 最大差值 基础贪心 蓝书上的例题
题目描述 有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值. 给定数组A及它的大小n,请返回最大差值. 测试样例: [10,5],2 返回:0 这题原题是蓝书上的例题 蓝书 ...
- 蓝书4.1-4.4 树状数组、RMQ问题、线段树、倍增求LCA
这章的数据结构题很真实 T1 排队 bzoj 1699 题目大意: 求静态一些区间的最大值-最小值 思路: ST表裸题 1 #include<iostream> 2 #include< ...
- 运送超级计算机 蓝书368
题解: 二分答案+最大流 首先二分答案天数x,然后对每个点建立x个点 对相连的两个点ai-bi+1,bi-ai+1连边,流量为1 然后ai-ai+1连边INF 如果最大流达到,那么就满足了条件 代码: ...
- C++添加一个头文件和extern以及全局变量和局部变量问题(清C++蓝书16.3.19上机的一小题)...
因为我当时老师讲的时候,并没有完全懂里面的原理,自己下来把各种情况都试了一遍,先记录下,以后好查漏补缺. 1. #include <iostream> #include"fn1. ...
- bzoj3032 七夕祭(蓝书刷题记录)
引入:经典贪心问题 均分纸牌 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动.移牌规则为:在编号为 1 堆上取的纸牌,只 ...
- To the MAX(蓝书刷题记录)
问题描述:给定一个 n*n 的矩阵,求最大子矩阵. 引发一个专题: 求最大子矩阵的方法. 方法一:最朴素的算法可以是枚举两个端点,在对其求和.复杂度O(n^6) hloj 1935护林员盖房子 方法二 ...
- 蓝书(算法竞赛进阶指南)刷题记录——CH#46A BZOJ3276 磁力块(bfs+分块)
题目:CH#46A. 题目大意:有一个元素a0=(x0,y0,m0,p0,r0)a_0=(x_0,y_0,m_0,p_0,r_0)a0=(x0,y0,m0,p0,r0)和其它nnn个元素a ...
最新文章
- C语言网络编程:TCP编程模型
- document.body.offsetWidth 网页可见区域高宽,offset、client、scroll使用方法详解,页面位置距离
- 【PyTorch】torch.cat==>张量拼接,在图像的应用上可以有效利用原始图像结构信息
- 【2015蓝桥杯省赛】C++ B组试题
- gitee 拥有3.7k星星的极速后台框架—FastAdmin了解一下
- sqoop-1.4.7安装
- oracle plm 文件系统,ORACLE-PlM管理方案(标准材料).ppt
- QC新旧七图汇总连载10——树状图
- 读《我喜欢生命本来的样子》记(二)
- word在试图打开文件时遇到错误,一种解决办法
- Dichotomy poj River Hopscotch
- 不使用转换器,DWG转DXF能否快速完成呢?
- 英伟达Tesla T4 显卡编解码能力测试
- 科学计算机隐藏功能,经常用手机计算器的抓紧看看,原来还隐藏着3个功能,涨知识了...
- 如何在微信中做好微信h5棋牌下载类推广防封防屏蔽?
- 【教学类-34-01】拼图(运动项目-长方块拼图)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)
- 开源问答社区软件Answer
- 设计模式之策略+工厂实现支付功能代码优化
- php向文件中写一行 换行,如何实现php向文件中写入换行
- vscode下载安装和配置使用
热门文章
- 云原生应用架构转型不好做?阿里云让你一步到位!
- 云原生:重新定义信息产业生态体系
- php转java知乎_做了三年多的php,在上一家公司转java一年多,如何找工作
- python 获取指定文件夹里面的图片文件的信息
- 上线4年从畅销Top 200到Top 20,这款刀塔传奇like卡牌正在美国市场逆流而上
- centos安装 TA-Lib
- 利用DBMS_FILE_TRANSFER传输数据库文件
- ubuntu部署git
- js/vue 高德地图绘制驾车路线图
- python学习之自习语法(20180626_update)