SGU 156 Strange Graph 欧拉回路,思路,汉密尔顿回路 难度:3
http://acm.sgu.ru/problem.php?contest=0&problem=156
这道题有两种点
1. 度数>2 在团中的点,一定连接一个度数为2的点
2. 度数等于2,连接两个团或者附着在一个团上的点
明显度数为2的点的两条边都是要走的,度数>2的点与度数2的点一一对应,所用的边也可以一一对应,所以这道哈密尔顿回路可以转化成欧拉回路
方法:第一种:建立新图,简单清晰
第二种:采用欧拉路的思想后续遍历,关键在怎样选取起点终点使得点迹可以形成回路
度数为2的点两条边肯定都要走完,
考虑度数大于2的点:
如果这时对应的度数为2的点没有走,那么先去度数为2的点
否则:
因为路径必须为团外-团内-团外(如果在团内有多步,那么度数就不平衡)
所以要标注上一步是在团外还是团内,如果上一步是在团外,那么这一步就可以选择一个团内的度数大于2的点
注意:一个度数大于2的团内点对应1个度数等于2的团外点,但是1个团外点对应2个团内点,所以不能直接用对应点是否已经访问作为团内点遍历条件
#include <cstdio>
#include <stack>
#include <cstring>
#include <vector>
using namespace std;
const int maxn=1e4+5;
const int maxm=1e5+5; int n,m,start;
int first[maxn];
int from[2*maxm],to[2*maxm];
int nxt[2*maxm]; int deg[maxn];
int len[maxn]; bool vis[maxn];
int two[maxn]; int ans[maxn],alen; void addedge(int f,int t,int ind){
nxt[ind]=first[f];
to[ind]=t;
from[ind]=f;
first[f]=ind;
deg[f]++;
}
void collect(int s,int f){
vis[s]=true;
for(int p=first[s];p!=0;p=nxt[p]){
int t=to[p];
if(deg[t]==2){
two[s]=t;
}
else if(deg[t]>2){
if(!vis[t]){
collect(t,f);
}
}
}
len[f]++;
}
void dfs(int s,bool in){
vis[s]=true;
// printf("reach %d\n",s);
if(deg[s]>2&&!vis[two[s]]){
dfs(two[s],false);
}
for(int p=first[s];p!=0;p=nxt[p]){
int t=to[p];
if(vis[t])continue;
if(deg[s]==2){
dfs(t,false);
}
else if(!in&°[t]>2){
dfs(t,true);
}
}
ans[alen++]=s;
// printf("exit %d\n",s);
} int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int f,t;
scanf("%d %d",&f,&t);
addedge(f,t,2*i);
addedge(t,f,2*i+1);
}
for(int i=1;i<=n;i++){
if(deg[i]>2&&!vis[i]){
collect(i,i);
if((len[i]&1)!=0){
puts("-1");
return 0;
}
}
}
memset(vis,0,sizeof(vis)); dfs(1,0);
if(alen!=n){
puts("-1");
return 0;
}
for(int i=0;i<n;i++){
printf("%d ",ans[i]);
}
puts("");
return 0;
}
SGU 156 Strange Graph 欧拉回路,思路,汉密尔顿回路 难度:3的更多相关文章
- SGU 156. Strange Graph(欧拉路)
时间限制:0.25s 空间限制:6M 题目描述 让我们想象一个无向图G=<V,E>.如果边(u,v)在边集E中,那么我们就说两个顶点u和v是邻接点.在这种情况下,我们也说u是v的一个邻接点 ...
- sgu 122. The book 满足ore性质的汉密尔顿回路 难度:2
122. The book time limit per test: 0.25 sec. memory limit per test: 4096 KB There is a group of N (2 ...
- 7-4 汉密尔顿回路(25 分) 【STL】
7-4 汉密尔顿回路(25 分) 著名的"汉密尔顿(Hamilton)回路问题"是要找一个能遍历图中所有顶点的简单回路(即每个顶点只访问 1 次).本题就要求你判断任一给定的回路是 ...
- SGU 145.Strange People(无环K短路)
时间:0.25s空间:4m 题意: 其实就是求无环第K短路. 输入: 给出n,m,k,分别代表,n个点,m条边,第k长路. 接下来m行,三个整数x,y,z,分别代表x,y之间有条费用为x的双向路.保证 ...
- POJ 2288 汉密尔顿回路 DP解决
题目大意: 有n个岛屿,令Vi为岛屿Ci的权值.一条汉密尔顿路径C1,C2,C3...Cn的值为3部分 第一部分,将路径中的岛的权值相加,第二部分将每条边上的(Ci,Cj),加上所有的Vi*Vj 第三 ...
- bzoj 2935 [Poi1999]原始生物——欧拉回路思路!
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2935 有向图用最小的路径(==总点数最少)覆盖所有边. 完了完了我居然连1999年的题都做不 ...
- hdu 4647 - Another Graph Game(思路题)
摘自题解: 若没有边权,则对点权从大到小排序即可.. 考虑边,将边权拆成两半加到它所关联的两个点的点权中即可. ..因为当两个人分别选择不同的点时,这一权值将互相抵消. 代码如下: #include ...
- HDU 4647 Another Graph Game 思路+贪心
官方题解: 若没有边权,则对点权从大到小排序即可.. 考虑边,将边权拆成两半加到它所关联的两个点的点权中即可. ..因为当两个人分别选择不同的点时,这一权值将互相抵消. #include <cs ...
- SGU 226.Colored graph(最短路)
时间限制:0.25s 空间限制:4M 题意: 给出一个n个节点,m条边的图,每条边都有标记了编号为1,2,3三种颜色之一,现在求从1号节点到n号节点的一条最短路径的长度,要求该路径中相邻的边没有相同的 ...
随机推荐
- Tensorflow中卷积的padding方式
根据tensorflow中的Conv2D函数,先定义几个基本符号: 输入矩阵W*W,这里只考虑输入宽高相等的情况,如果不相等,推导方法一样 filter矩阵F*F,卷积核 stride值S,步长 输出 ...
- android gson使用
第一步注册: compile 'com.google.code.gson:gson:2.6.2' 第二步初始化: Gson gson = new GsonBuilder() .setLenient( ...
- 华硕主板M2N-电源跳线怎么接
华硕主板M2N 详细参数 http://detail.zol.com.cn/91/90618/param.shtml 电源跳线的连接方法:1.把所有排线理在一起,根据上面的标注,先来明确每根线的定义: ...
- 使用JavaScript修改浏览器URL地址栏的实现代码
现在的浏览器里,有一个十分有趣的功能,你可以在不刷新页面的情况下修改浏览器URL;在浏览过程中.你可以将浏览历史储存起来,当你在浏览器点击后退按钮的时候,你可以冲浏览历史上获得回退的信息,这听起来并不 ...
- Spark2.0 shuffle service
Spark 的shuffle 服务是spark的核心,本文介绍了非ExternalShuffleClient的方式,看BlockService的整个架构.ShuffleClient是整个框架的基础,有 ...
- Xcel 测试版使用手册
基于无任何文笔可言,所以直接上使用方法吧. 1.引用dll,如何引用dll请谷歌. 2.使用 //实例化对象 LT.XMLExcel.XlsxOption xOption = new LT.XMLEx ...
- 2018-2019 ICPC, NEERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred) Solution
A. Alice the Fan Solved. 题意: 两个人打网球,要求teamA 的得分与其他队伍拉开尽量大 输出合法的方案 思路: $dp[i][j][k][l] 表示 A 赢i局,其他队伍赢 ...
- 20155305乔磊2016-2017-2《Java程序设计》第九周学习总结
20155305 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 JDBC入门 JDBC简介 1.JDBC是java联机数据库的标准规范,它定义了一组标准类与 ...
- MFC中利用GDI+进行双缓冲作图的有关设置
这里只是在遇到实际问题的时候提出的一种解决方法,用以处理闪屏问题. 首先要做的是对GDI的一个设置问题: 在应用程序类中添加一个保护权限数据成员 class C...App: {... private ...
- Vue学习笔记之Webpack介绍
在这里我仅仅的是对webpack做个讲解,webpack这个工具非常强大,解决了我们前端很繁琐的一些工具流程繁琐的事情.如果感兴趣的同学,简易还是看官网吧. 中文链接地址:https://www.we ...