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 欧拉回路相关推荐

  1. 刘汝佳蓝书后缀数组模板解释及补全

    相信很多初学后缀数组的ACMer在学习蓝书中的后缀数组部分遇到了一些障碍,可能像我一样看明白了P219 --220的讲解和算法,百度了基数排序的方法,然后被卡在P221的代码上了,本文目的即分享我对这 ...

  2. 对刘汝佳蓝书点双连通分量(BCC)模板的理解

    /*经过简单的使用,对刘汝佳的这个板做几个简单的说明:1.算法结束后每个bcc[i]里存入一个双连通分量的点的标号,其中割点也被存进去,也就是说割点可以属于多个双连通分量2.根据刘汝佳所说的点-双连通 ...

  3. 牛客 美团编程真题 MT1 最大差值 基础贪心 蓝书上的例题

    题目描述 有一个长为n的数组A,求满足0≤a≤b<n的A[b]-A[a]的最大值. 给定数组A及它的大小n,请返回最大差值. 测试样例: [10,5],2 返回:0 这题原题是蓝书上的例题 蓝书 ...

  4. 蓝书4.1-4.4 树状数组、RMQ问题、线段树、倍增求LCA

    这章的数据结构题很真实 T1 排队 bzoj 1699 题目大意: 求静态一些区间的最大值-最小值 思路: ST表裸题 1 #include<iostream> 2 #include< ...

  5. 运送超级计算机 蓝书368

    题解: 二分答案+最大流 首先二分答案天数x,然后对每个点建立x个点 对相连的两个点ai-bi+1,bi-ai+1连边,流量为1 然后ai-ai+1连边INF 如果最大流达到,那么就满足了条件 代码: ...

  6. C++添加一个头文件和extern以及全局变量和局部变量问题(清C++蓝书16.3.19上机的一小题)...

    因为我当时老师讲的时候,并没有完全懂里面的原理,自己下来把各种情况都试了一遍,先记录下,以后好查漏补缺. 1. #include <iostream> #include"fn1. ...

  7. bzoj3032 七夕祭(蓝书刷题记录)

    引入:经典贪心问题 均分纸牌 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动.移牌规则为:在编号为 1 堆上取的纸牌,只 ...

  8. To the MAX(蓝书刷题记录)

    问题描述:给定一个 n*n 的矩阵,求最大子矩阵. 引发一个专题: 求最大子矩阵的方法. 方法一:最朴素的算法可以是枚举两个端点,在对其求和.复杂度O(n^6) hloj 1935护林员盖房子 方法二 ...

  9. 蓝书(算法竞赛进阶指南)刷题记录——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 ...

最新文章

  1. C语言网络编程:TCP编程模型
  2. document.body.offsetWidth 网页可见区域高宽,offset、client、scroll使用方法详解,页面位置距离
  3. 【PyTorch】torch.cat==>张量拼接,在图像的应用上可以有效利用原始图像结构信息
  4. 【2015蓝桥杯省赛】C++ B组试题
  5. gitee 拥有3.7k星星的极速后台框架—FastAdmin了解一下
  6. sqoop-1.4.7安装
  7. oracle plm 文件系统,ORACLE-PlM管理方案(标准材料).ppt
  8. QC新旧七图汇总连载10——树状图
  9. 读《我喜欢生命本来的样子》记(二)
  10. word在试图打开文件时遇到错误,一种解决办法
  11. Dichotomy poj River Hopscotch
  12. 不使用转换器,DWG转DXF能否快速完成呢?
  13. 英伟达Tesla T4 显卡编解码能力测试
  14. 科学计算机隐藏功能,经常用手机计算器的抓紧看看,原来还隐藏着3个功能,涨知识了...
  15. 如何在微信中做好微信h5棋牌下载类推广防封防屏蔽?
  16. 【教学类-34-01】拼图(运动项目-长方块拼图)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)
  17. 开源问答社区软件Answer
  18. 设计模式之策略+工厂实现支付功能代码优化
  19. php向文件中写一行 换行,如何实现php向文件中写入换行
  20. vscode下载安装和配置使用

热门文章

  1. 云原生应用架构转型不好做?阿里云让你一步到位!
  2. 云原生:重新定义信息产业生态体系
  3. php转java知乎_做了三年多的php,在上一家公司转java一年多,如何找工作
  4. python 获取指定文件夹里面的图片文件的信息
  5. 上线4年从畅销Top 200到Top 20,这款刀塔传奇like卡牌正在美国市场逆流而上
  6. centos安装 TA-Lib
  7. 利用DBMS_FILE_TRANSFER传输数据库文件
  8. ubuntu部署git
  9. js/vue 高德地图绘制驾车路线图
  10. python学习之自习语法(20180626_update)