传送门

真实的自闭= =+

考试的时候老师明明说了可以路径为空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. BZOJ 4836: [Lydsy1704月赛]二元运算 分治FFT

    Code: #include<bits/stdc++.h> #define ll long long #define maxn 500000 #define setIO(s) freope ...

  2. 数据库的特性与隔离级别和spring事务的传播机制和隔离级别

    首先数据库的特性就是 ACID: Atomicity 原子性:所有事务是一个整体,要么全部成功,要么失败 Consistency 一致性:在事务开始和结束前,要保持一致性状态 Isolation 隔离 ...

  3. loj#2334 「JOI 2017 Final」JOIOI 王国

    分析 二分答案 判断左上角是否满足 为了覆盖所有范围 我们依次把右下角,左上角,右上角移动到左上角 代码 #include<bits/stdc++.h> using namespace s ...

  4. JS对象—字符串总结(创建、属性、方法)

    1.创建字符串     1.1 new String(s)         String和new一起使用,创建的是一个字符串对象,存放的是字符串s的表示.     1.2 String(s)     ...

  5. oracle两表中的两列进行模糊匹配的方法

    SELECT T2.列名,T1.列名  FROM 主表 T1, 匹配表 T2    WHERE  T1.匹配列  LIKE CONCAT('%',concat(T2.匹配列,'%')); 注意:  a ...

  6. Win10.资料

    1.Win10版本consumer editions和business editions有什么区别?(http://www.winwin7.com/JC/10722.html) 2.密钥 win10 ...

  7. mysql练习题目试水50题,附建库sql代码

    如果你没试过水的话,那一题一题地每一题都敲一遍吧.不管它们对你看来有多么简单.  建库代码 部分题目答案在末尾,可用ctrl f  搜索题号. 作业练习——学生-选课 表结构 学生表: Student ...

  8. Linux部署禅道环境

    1.打开WinSCP 2.  输入Linux IP 用户名(root)及密码(123456)并点击保存 3.  点击登录后再输入一次密码 4.把ZenTaoPMS.11.2.stable.zbox_6 ...

  9. confd + Nacos | 无代码侵入的配置变更管理

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来文来自阿里中间件投稿 作者:风卿,Nacos Committer,阿里巴巴开发工程师 为什么要支持confd,老的应用配置 ...

  10. HTTP中ip地址伪造的问题以及解决办法

    在真实环境下,php获取客户端ip地址的方法通常有以下几种: (1):通过$_SERVER[ "HTTP_CLIENT_IP" ] (2):通过$_SERVER[ "HT ...