题目:http://codeforces.com/contest/36/problem/E

找出两条欧拉路覆盖无向图。

套上欧拉路模板。用过的边要记录。

注意 一个连通块、4个奇度数点 的情况是在两个奇度数点之间连一条边,跑完欧拉路后再断开!而不是……

特别奇怪的一点是如果不写那个  跑完欧拉路后发现队列里的边不足m条就输出-1  就会WA。

  但Zinn没有这个特判,我也觉得这种情况很奇怪。可能是代码别的地方写错了?

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e4+;
int n,m,mp[N],hd[N],xnt,deg[N],col[N],cnt;
int sta[N],top,q[N],jd,ct1;
bool use[N],vis[N];
struct Ed{
int nxt,to,bh;Ed(int n=,int t=,int b=):nxt(n),to(t),bh(b) {}
}ed[N<<];
void add(int x,int y,int b)
{
ed[++xnt]=Ed(hd[x],y,b);hd[x]=xnt;
ed[++xnt]=Ed(hd[y],x,b);hd[y]=xnt;
}
void dfs(int cr)
{
col[cr]=cnt;if(deg[cr]&)q[++jd]=cr;
for(int i=hd[cr];i;i=ed[i].nxt)
if(!col[ed[i].to])dfs(ed[i].to);
}
void dfs(int rt,int cr,int fa)
{
vis[cr]=;
for(int i=hd[cr];i;/*i=hd[cr]*/i=ed[i].nxt)
if(!use[ed[i].bh])
{
// hd[cr]=ed[i].nxt;//!
use[ed[i].bh]=;
dfs(rt,ed[i].to,cr);
sta[++top]=ed[i].bh;
if(ed[i].bh==m+)ct1=--top;
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d",&m);int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(!mp[x])mp[x]=++n;
if(!mp[y])mp[y]=++n;
deg[mp[x]]++;deg[mp[y]]++;
add(mp[x],mp[y],i);
}
for(int i=;i<=n;i++)
if(!col[i])
{
cnt++;dfs(i);
}
if(cnt>||jd>||m==){printf("-1\n");return ;}
if(cnt==&&jd==&&col[q[]]==col[q[]]==col[q[]]==col[q[]]){printf("-1\n");return ;}
memset(vis,,sizeof vis);
if(cnt==)
{
if(jd)
{
dfs(q[],q[],);ct1=top;
if(jd==)
{
for(int i=;i<=n;i++)
if(!vis[i]){dfs(i,i,);break;}
}
else{
for(int i=;i<=;i++)
if(!vis[q[i]]){dfs(q[i],q[i],);break;}
}
}
else{
dfs(,,);ct1=top;
for(int i=;i<=n;i++)if(!vis[i]){dfs(i,i,);break;}
}
}
else{
if(jd)
{
if(jd==){
add(q[],q[],m+);dfs(q[],q[],);/////////
}
else dfs(q[],q[],),ct1=top;
}
else ct1=m,dfs(,,);
}
if(top!=m){printf("-1");return ;}///////?
if(ct1==top)
{
printf("1\n%d\n",sta[top]);
printf("%d\n",ct1-);
for(int i=top-;i;i--)printf("%d ",sta[i]);
return ;
}
printf("%d\n",ct1);
for(int i=ct1;i;i--)
printf("%d ",sta[i]);
printf("\n");
printf("%d\n",top-ct1);
for(int i=top;i>ct1;i--)
printf("%d ",sta[i]);
return ;
}

CF 36E Two Paths——欧拉路的更多相关文章

  1. CF 36E Two Paths

    传送门 真实的自闭= =+ 考试的时候老师明明说了可以路径为空T^T 然后光荣的挂掉了 20分的链[明明是最送分的] 上来就看出来欧拉回路了嘛 然后思考了一下大概奇点配个对 删一条简单路径剩下的跑欧拉 ...

  2. CF 508D Tanya and Password(无向图+输出欧拉路)

    ( ̄▽ ̄)" //不知道为什么,用scanf输入char数组的话,字符获取失效 //于是改用cin>>string,就可以了 //这题字符的处理比较麻烦,输入之后转成数字,用到函 ...

  3. Codeforces 789D Weird journey - 欧拉路 - 图论

    Little boy Igor wants to become a traveller. At first, he decided to visit all the cities of his mot ...

  4. Codeforces Round #407 (Div. 2) D. Weird journey(欧拉路)

    D. Weird journey time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  5. 洛谷P1341 无序字母对[无向图欧拉路]

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...

  6. POJ1386Play on Words[有向图欧拉路]

    Play on Words Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11846   Accepted: 4050 De ...

  7. hdu1161 欧拉路

    欧拉路径是指能从一个点出发能够“一笔画”完整张图的路径:(每条边只经过一次而不是点) 在无向图中:如果每个点的度都为偶数 那么这个图是欧拉回路:如果最多有2个奇数点,那么出发点和到达点必定为该2点,那 ...

  8. UVA10054The Necklace (打印欧拉路)

    题目链接 题意:一种由彩色珠子组成的项链.每个珠子的两半由不同的颜色组成.相邻的两个珠子在接触的地方颜色相同.现在有一些零碎的珠子,需要确定他们是否可以复原成完整的项链 分析:之前也没往欧拉路上面想, ...

  9. 洛谷 P1341 无序字母对 Label:欧拉路 一笔画

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...

随机推荐

  1. CMD mysql 备份脚本

    创建.bat文件 echo. echo MySQL数据库备份脚本 echo ***************************** echo. echo 备份日期:%date% echo 备份时间 ...

  2. indy10 UDP实例

    UDP就比较简单了,放个按钮,一个TIdUDPServerTIdUDPServer绑定 0.0.0.0:3820,然后Active设置为True //发送按钮procedure TForm1.Butt ...

  3. HDU 3449 Consumer

    这是一道依赖背包问题.背包问题通常的解法都是由0/1背包拓展过来的,这道也不例外.我最初想到的做法是,由于有依赖关系,先对附件做个DP,得到1-w的附件背包结果f[i]表示i花费得到的最大收益,然后把 ...

  4. gcc编译c、c++入门

    一.c语言 1.在当前目录下新建c文件 $:vim hello.c 2.按i进入编辑模式.按esc退出编辑模式,输入源代码 #include <stdio.h> int main(void ...

  5. 关于Pytorch的二维tensor的gather和scatter_操作用法分析

    看得不明不白(我在下一篇中写了如何理解gather的用法) gather是一个比较复杂的操作,对一个2维tensor,输出的每个元素如下: out[i][j] = input[index[i][j]] ...

  6. c++ boost库学习二:内存管理->智能指针

    写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...

  7. Eclipse常用插件安装_PropertiesEditor

    properties文件在项目中多用做i18n国际化支持的配置文件,在properties文件中出现的中文信息都要转换为Unicode文本,一般的做法都是使用JDK自带的native2ascii工具进 ...

  8. Python httpServer服务器(初级)

    使用原生的python开发的web服务器,入门级! #!/usr/bin/python # -*- coding: UTF-8 -*- import os #Python的标准库中的os模块包含普遍的 ...

  9. nova libvirt event

    nova中利用libvirt 事件来更新vm的DB中的power状态 https://wiki.openstack.org/wiki/ComputeDriverEvents Nova compute ...

  10. 使用BeanUtils方法拷贝不上问题

    最近在项目中,发现BeanUtils.copyProperties方法拷贝bean属性时候,有的时候会失效.最后发现是由于项目中引用了spring和common两个包,都有BeanUtils方法,错误 ...