传送门

真实的自闭= =+

考试的时候老师明明说了可以路径为空T^T

然后光荣的挂掉了 20分的链【明明是最送分的】

上来就看出来欧拉回路了嘛 然后思考了一下大概奇点配个对 删一条简单路径剩下的跑欧拉路径就好了嘛 然后就冒出来了这个东西

如果简单路径删了的话 图就不连通了= =||

心态崩塌【后来发现数据没卡这玩意T^T】

想新加边 但是发现这样就变成三段路径了= =||

然后孙神一眼切表示你强制第一步走新加的边就好了嘛

我好菜啊QAQ

于是就剩下一堆【真实的一堆】奇奇怪怪的细节

于是今天上午机房里弥漫着愉悦的hack气氛

具体处理什么的看代码吧QwQ

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#define inf 20021225
#define ll long long
#define mxn 100010
using namespace std; struct edge{int to,lt;}e[mxn<<1];
int d[mxn],cnt=1,in[mxn],n,m;
void add(int x,int y)
{
e[++cnt].to=y;e[cnt].lt=in[x];in[x]=cnt;
e[++cnt].to=x;e[cnt].lt=in[y];in[y]=cnt;
}
stack<int> st;bool vis[mxn],ag[mxn];
void eulerpath(int x)
{
ag[x]=1;
for(int &t=in[x];t;t=e[t].lt)
{
if(vis[t>>1]) continue;
vis[t>>1]=1;int id=t>>1;
eulerpath(e[t].to);
st.push(id);
}
}
int inq[mxn],sz;
void dfs(int x,int col)
{
inq[x]=col;sz++;
for(int i=in[x];i;i=e[i].lt)
{
if(inq[e[i].to]) continue;
dfs(e[i].to,col);
}
}
int q[6],tot;
int ans[mxn];
bool solve()
{
if(m<2) return false;
int ltk=0,start[3];int i,nxt=0;
for(int i=1;i<=n;i++)
{
if(!inq[i])
{
sz=0;dfs(i,ltk+1);
if(sz>1) start[++ltk]=i;
}
}
if(ltk>2) return false;
for(int i=1;i<=n;i++)
{
if(d[i]&1) q[++tot]=i;
if(tot>4) break;
}
if(tot>4) return false;
if(tot==2) add(q[1],q[2]);
if(tot==4)
{
if(ltk==2&&inq[q[1]]==inq[q[2]]&&inq[q[2]]==inq[q[3]]) return false;
for(i=2;i<5;i++) if(inq[q[i]]==inq[q[1]]) break;
add(q[i],q[1]);
if(i==2) nxt=3,add(q[3],q[4]);
if(i==3) nxt=4,add(q[2],q[4]);
if(i==4) nxt=2,add(q[2],q[3]);
}
eulerpath(tot?q[1]:start[1]);
int dis=0;
if(!st.empty()&&st.top()>m) st.pop();
while(!st.empty())
{
int x=st.top();st.pop();
if(x>m) break;
ans[++dis]=x;
}
if(dis==m)
{
//printf("QAQ");
printf("%d\n",dis-1);
for(int i=1;i<dis;i++) printf("%d ",ans[i]);
printf("\n");
printf("%d\n%d\n",1,ans[dis]);
return true;
}
printf("%d\n",dis);
for(int i=1;i<=dis;i++) printf("%d ",ans[i]);
printf("\n");
int tou=0;
if(tot==4){if(!ag[q[nxt]])eulerpath(q[nxt]),tou=1;}
else if(ltk==2){if(!ag[start[2]])eulerpath(start[2]);if(!ag[start[1]])eulerpath(start[1]);}
dis=0;
if(tou) if(st.top()>m) st.pop();
while(!st.empty())
{
int x=st.top();st.pop();
if(x>m) break;
ans[++dis]=x;
}
printf("%d\n",dis);//printf("QAQ");
for(int i=1;i<=dis;i++) printf("%d ",ans[i]);
return true;
}
int main()
{
int x,y;
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),add(x,y),d[x]++,d[y]++;
if(!solve()) printf("-1\n");
return 0;
}

这一份是考试的改的 那个读入什么的有一些偏差qwq

CF 36E Two Paths的更多相关文章

  1. CF 36E Two Paths——欧拉路

    题目:http://codeforces.com/contest/36/problem/E 找出两条欧拉路覆盖无向图. 套上欧拉路模板.用过的边要记录. 注意 一个连通块.4个奇度数点 的情况是在两个 ...

  2. CF Gym102028G Shortest Paths on Random Forests

    传送门 这题要求的期望,就是总权值(所有不在同一个连通块点对的贡献+同一连通块点对的贡献)/总方案(森林个数) 先求森林个数,森林是由一堆树组成的,而根据purfer序列,一棵\(n\)个点的有标号的 ...

  3. CF Gym 102028G Shortest Paths on Random Forests

    CF Gym 102028G Shortest Paths on Random Forests 抄题解×1 蒯板子真jir舒服. 构造生成函数,\(F(n)\)表示\(n\)个点的森林数量(本题都用E ...

  4. CF 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths [dsu on tree 类似点分治]

    D. Arpa's letter-marked tree and Mehrdad's Dokhtar-kosh paths CF741D 题意: 一棵有根树,边上有字母a~v,求每个子树中最长的边,满 ...

  5. CF 741 D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

    D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths http://codeforces.com/problemset/probl ...

  6. E CF R 85 div2 1334E. Divisor Paths

    LINK:Divisor Paths 考试的时候已经想到结论了 可是质因数分解想法错了 导致自闭. 一张图 一共有D个节点 每个节点x会向y连边 当且仅当y|x,x/y是一个质数. 设f(d)表示d的 ...

  7. CF 545E Paths and Trees

    题目大意:给出n个点,m条无向边,每条边有长度.求一棵树,要求树上的每个点到源点距离最小的前提下,使得树上的边的长度和最小.输出树上边的总长度,以及树上的边的序号(按输入顺序 1...m). 思路 : ...

  8. 【SSSP】A forward-backward single-source paths algorithm

    0. 引子基础的算法和数据结构已经学习的差不多了,上学期期末就打算重点研究研究STOC和FOCS上面的论文.做这件事情的初衷是了解别人是如何改进原有算法的,搞清楚目前比较热的算法问题有哪些,更重要的是 ...

  9. Shortest Paths

    最短路径 APIs 带权有向图中的最短路径,这节讨论从源点(s)到图中其它点的最短路径(single source). Weighted Directed Edge API 需要新的数据类型来表示带权 ...

随机推荐

  1. Angular:自定义表单控件

    分享一个最近写的支持表单验证的时间选择组件. import {AfterViewInit, Component, forwardRef, Input, OnInit, Renderer} from & ...

  2. Linux系统判断当前运行的 Apache 所使用的配置文件

    问题描述 由于历史备份.更新等原因,导致在 Linux 系统服务器中存在多个 Apache目录,如果不是网站的配置人员,可能会不清楚应该修改哪个配置文件进行网站调整. 解决方案 可以通过如下步骤,判断 ...

  3. 一种算法的实现,几个相同大小的div组合在一起,判断是不是矩形

  4. eclipse 4.5 离线安装mybatis generator1.3.6卡在Install New Software的解决方法

    转载:https://blog.csdn.net/ssshen14/article/details/80004459 离线插件 下载:https://github.com/mybatis/genera ...

  5. 实现word在线预览 有php的写法 也有插件似

    <?php //header("Content-type:text/html;charset=utf-8"); //word转html 展示 $lj=$_GET['file' ...

  6. NOIp 基础数论知识点总结

    推荐阅读 NOIp 数学知识点总结: https://www.cnblogs.com/greyqz/p/maths.html Basic 常用素数表:https://www.cnblogs.com/g ...

  7. 29 August

    P1352 Bosses' Masquerade 树形DP模板. #include <cstdio> #include <algorithm> using namespace ...

  8. js初步简单的编程代码

    简单图片切换编码demo图片地址自行替换 简单图片切换编码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  9. .htaccess 详解

    .htaccess是什么 .htaccess文件(或者"分布式配置文件")提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目 ...

  10. 结合Pool进程池进程,实现进程之间的通讯,稍微复杂的运用

    #进程池中的Queue """ 如果要用Pool创建进程,就需要multiprocessing.Manager()中的Queue() 而不是multiprocessing ...