博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF36 E Two Paths——欧拉(回)路
阅读量:4453 次
发布时间:2019-06-07

本文共 2537 字,大约阅读时间需要 8 分钟。

题目:

给定一张无向图,要求输出两条欧拉路覆盖所有边;

分类讨论,首先判-1:有两个以上连通块 / 有四个以上奇度数点 / 只有一条边 / 有两个连通块而其中一个连通块里有四个奇度数点 (/ 有连通块里有奇数个奇度数点);

然后分两个连通块和一个连通块的情况进行 dfs 找欧拉路(模板 dfs );

注意可能没有奇度数的点,也就是有欧拉回路,所以不仅找奇度数点进行 dfs ,还要在那之后 dfs 仍然没有被走过的点;

明明是模仿题解写的竟然还调了两小时...码力++...

代码如下:

#include
#include
#include
using namespace std;int const maxn=10005;int n,m,d[maxn],ans[maxn],tot,fa[maxn],cnt,c[maxn],hd[maxn],ct=1;bool vis[maxn],used[maxn];struct N{ int to,nxt; N(int t=0,int n=0):to(t),nxt(n) {}}ed[maxn<<1];void add(int x,int y){ed[++ct]=N(y,hd[x]); hd[x]=ct;}int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);}void dfs(int x){ vis[x]=1; for(int i=hd[x];i;i=hd[x]) { hd[x]=ed[i].nxt; if(used[i>>1])continue; used[i>>1]=1; dfs(ed[i].to); ans[++tot]=(i>>1); }}int main(){ freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=10000; scanf("%d",&m);//不能是 n=10005 for(int i=1;i<=n;i++)fa[i]=i;//!! for(int i=1,x,y;i<=m;i++) { scanf("%d%d",&x,&y); add(x,y); add(y,x); d[x]++; d[y]++; if(find(x)!=find(y))fa[find(x)]=find(y); } for(int i=1;i<=n;i++) if(d[i]&1) c[find(i)]++; for(int i=1;i<=n;i++) if(c[i]&1){printf("-1\n"); return 0;} for(int i=1,sum=0;i<=n;i++) { if(d[i])cnt+=(i==find(i)); if(c[i])sum+=c[i]; if(sum>4){printf("-1\n"); return 0;} } if(cnt>2){printf("-1\n"); return 0;} if(cnt==2) { for(int i=1;i<=n;i++) if(c[i]==4){printf("-1\n"); return 0;} for(int i=1;i<=n;i++) if(!vis[i]&&(d[i]&1)) { tot=0; dfs(i); printf("%d\n",tot); for(int j=tot;j;j--)printf("%d ",ans[j]); printf("\n"); } for(int i=1;i<=n;i++)//欧拉回路 if(!vis[i]&&d[i]) { tot=0; dfs(i); printf("%d\n",tot); for(int j=tot;j;j--)printf("%d ",ans[j]); printf("\n"); } } else { bool fl=0; for(int i=1;i<=n;i++) if(c[i]==4)fl=1; if(fl) { for(int i=1;i<=n;i++) if(d[i]&1) { for(int j=i+1;j<=n;j++) if(d[j]&1){d[i]++; d[j]++; add(i,j); add(j,i); break;} break; } for(int i=1;i<=n;i++) if(!vis[i]&&(d[i]&1)){tot=0; dfs(i); break;} for(int i=1;i<=tot;i++) if(ans[i]==m+1) { printf("%d\n",i-1); for(int j=1;j

 

转载于:https://www.cnblogs.com/Zinn/p/9279336.html

你可能感兴趣的文章
2014年生日
查看>>
扫描目录下的文件并拼接在一起
查看>>
ELK 分布式日志处理 10.12
查看>>
Java虚拟机详解05----垃圾收集器及GC参数
查看>>
7. 单位,移动布局
查看>>
inux中bin与sbin目录的作用及区别介绍
查看>>
USACO 3.1 Contact
查看>>
Office之什么是高内聚低耦合
查看>>
一些奇怪的问题求回答
查看>>
这些年踩过的坑
查看>>
iOS开发拓展篇——如何把项目托管到GitHub
查看>>
性能优化之数据库优化
查看>>
类的继承、菱形继承、派生、多态
查看>>
mysql约束
查看>>
javascript鼠标及键盘事件总结及案例
查看>>
mysql表之间的关系及级联操作
查看>>
mac 搭建virtualenv的那些坑
查看>>
多路复用IO模型
查看>>
并发、串行、并行及多道技术原理
查看>>
hashlib、pickle、hmac、logging模块使用
查看>>