传送门

真实的自闭= =+

考试的时候老师明明说了可以路径为空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. [UOJ211][UER #6]逃跑

    题意:从原点出发,走\(n\)次,每次往四个方向中随机一个走,走每个方向有个概率,求所有方案走到过的点数的方差. 题解:orz kczno1 \(E*all=\sum (a_i-avg)^2*all= ...

  2. brew安装指定版本的软件

    原文:https://www.jianshu.com/p/aadb54eac0a8 在mac中使用 brew install 安装的软件默认都是最新版本的.有时候我们需要旧版本(指定版本)的时候,应该 ...

  3. laravel5.6操作数据curd写法(查询构建器)

    laravel5.6 数据库操作-查询构建器 <?php //laravel5.6 语法 demo示例 namespace App\Http\Controllers;//命名该控制App空间下名 ...

  4. BZOJ 5170: Fable

    离散化+树状数组 求当前位之前是否有k位比它大 这样的话它就需要前移k位 剩下的按照原来的顺序依次填入 其实我觉得sort一下就可以做出来了 太久没写树状数组了 所以写了一下树状数组 #include ...

  5. jajaj

    Docs » 第二章:字符串和文本 » 2.2 字符串开头或结尾匹配 Edit on GitHub 2.2 字符串开头或结尾匹配¶ 问题¶ 你需要通过指定的文本模式去检查字符串的开头或者结尾,比如文件 ...

  6. base64编码操作图片

    package com.trsmedia.service; import java.io.FileInputStream; import java.io.FileOutputStream; impor ...

  7. Failed to load resource: the server responsed with a status of 400 (Bad Request)

    浏览器报错:Failed to load resource: the server responsed with a status of 400 (Bad Request) ajax请求失败,一般情况 ...

  8. Ubuntu下apt-get 安装apache2、php、mysql后的默认路径

    apache: 采用apt-get 在线安装,安装路径应在/etc/apache2目录下 apache配置文件/etc/apache2/apache2.conf Apache模块路径:/usr/sbi ...

  9. JSP+JavaBean 登陆验证

    1.java package cn.gs.ly; import java.util.HashMap; import java.util.Map; public class Register { pri ...

  10. vlan vtp配置

    vlan vtp配置 VTP:Vlan Trunking Protocol 用于管理VLAN(统一创建.修改.删除).用来同步vlan. VTP的原理   VTP模式(服务器,客户端和透明模式)   ...