CF 36E Two Paths
传送门
真实的自闭= =+
考试的时候老师明明说了可以路径为空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的更多相关文章
- CF 36E Two Paths——欧拉路
题目:http://codeforces.com/contest/36/problem/E 找出两条欧拉路覆盖无向图. 套上欧拉路模板.用过的边要记录. 注意 一个连通块.4个奇度数点 的情况是在两个 ...
- CF Gym102028G Shortest Paths on Random Forests
传送门 这题要求的期望,就是总权值(所有不在同一个连通块点对的贡献+同一连通块点对的贡献)/总方案(森林个数) 先求森林个数,森林是由一堆树组成的,而根据purfer序列,一棵\(n\)个点的有标号的 ...
- CF Gym 102028G Shortest Paths on Random Forests
CF Gym 102028G Shortest Paths on Random Forests 抄题解×1 蒯板子真jir舒服. 构造生成函数,\(F(n)\)表示\(n\)个点的森林数量(本题都用E ...
- 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,求每个子树中最长的边,满 ...
- 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 ...
- E CF R 85 div2 1334E. Divisor Paths
LINK:Divisor Paths 考试的时候已经想到结论了 可是质因数分解想法错了 导致自闭. 一张图 一共有D个节点 每个节点x会向y连边 当且仅当y|x,x/y是一个质数. 设f(d)表示d的 ...
- CF 545E Paths and Trees
题目大意:给出n个点,m条无向边,每条边有长度.求一棵树,要求树上的每个点到源点距离最小的前提下,使得树上的边的长度和最小.输出树上边的总长度,以及树上的边的序号(按输入顺序 1...m). 思路 : ...
- 【SSSP】A forward-backward single-source paths algorithm
0. 引子基础的算法和数据结构已经学习的差不多了,上学期期末就打算重点研究研究STOC和FOCS上面的论文.做这件事情的初衷是了解别人是如何改进原有算法的,搞清楚目前比较热的算法问题有哪些,更重要的是 ...
- Shortest Paths
最短路径 APIs 带权有向图中的最短路径,这节讨论从源点(s)到图中其它点的最短路径(single source). Weighted Directed Edge API 需要新的数据类型来表示带权 ...
随机推荐
- SPFA的两个优化
评测题:洛谷[模板]单源最短路径 不加任何优化: queue<int>q; void spfa(ll s) { ;i<=n;i++) d[i]=(ll)(); d[s]=;q.pus ...
- CSS实现回到顶部图片hover后改变效果
任何网站中回到顶部元素不可缺少,一般为了实现交互效果,都会在鼠标hover后元素样式有所改变.今天这个实例便是采用CSS中的transform知识实现. hover: <!DOCTYPE htm ...
- 12 October
次小生成树 http://poj.org/problem?id=1679 不难得出,次小生成树可以由最小生成树更换一条边得到. 首先构造原图的最小生成树,然后枚举每一条不在最小生成树中的边 (u, v ...
- Vue子组件传递数据给父组件
子组件通过this.$emit(event,data)传递数据到父组件 以下是例子: father.vue 父组件 <template> <div> <child @ne ...
- jsc2019_qualC Cell Inversion
先吐槽一下这个比赛的奇怪名字 这个破名字让我实在不知道博客标题该叫啥/px 题目大意 给你一个长度为2n的序列 包括W和B 每次可以选一个区间将里面的颜色反转 但是每个点只能被作为端点选一次 问将序列 ...
- Docker 官网文档翻译汇总
官方文档地址 Guide Docker 入门 Docker 入门教程 方向和设置 容器 服务 swarm 集群 stack 部署应用 概述 用 Docker 进行开发 在 Docker 上开发应用 应 ...
- js-jssdk微信H5选择多张图片预览并上传(兼容ios,安卓,已测试)
值得注意的是: 1.在微信H5中选择图片运用:wx.chooseImage,成功后返回: res.localIds用于上传图片使用 上传图片:wx.uploadImage. 2.上传图片的时候 ...
- TypeError: 'generator' object is not subscriptable
TypeError: 'generator' object is not subscriptable 生成器对象不可以带下标 def get_row(self,row_no): if not isin ...
- Spring Security 01
环境搭建 maven依赖jar包 <!-- spring-security --> <dependency> <groupId>org.springframewor ...
- CentOS7通过SpeedTest工具测速
首先要安装SpeedTest工具,这里提供两种方法安装SpeedTest: 一.通过直接下载SpeedTest脚本,给权限运行脚本即可 [root@bogon ~]#wget -O speedtest ...