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&&deg[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;
}

  

最新文章

  1. DELETE ANYTHING
  2. WIN8应用隐私声明
  3. linux下设置进程优先级方法!
  4. Ubuntu 12.04(32位)安装Oracle 11g(32位)
  5. ylbtech-dbs:ylbtech-2,PAM(个人资产管理系统)
  6. apache开源项目--Cassandra
  7. glance was not installed properly
  8. 关于使用百度ueditor时的一些问题
  9. Hadoop3.0 WordCount测试一直Accept 状态,Nodes of the cluster 页面node列表个数为0
  10. Pandas 基础(15) - date_range 和 asfreq
  11. VSCode插件开发全攻略(三)package.json详解
  12. esp8266(1) 手机+Arduino+esp8266通信
  13. linux中tree命令
  14. 指定文件兼容性模式 &lt; meta http-equiv = &quot;X-UA-Compatible&quot; content = &quot;IE=edge,chrome=1&quot; /&gt;的意义
  15. 使用jquery ajax代替iframe
  16. 缓存数据库-redis介绍
  17. Java实现对Mysql的图片存取操作
  18. 使用STL中的list容器实现单链表的操作
  19. HDU - 6166:Senior Pan(顶点集合最短路&amp;二进制分组)
  20. maven自动建立目录骨架

热门文章

  1. DevOps 创建pipline报错:The value specified for SourceVersion is not a valid commit ID
  2. mysql 数据操作 单表查询 group by 介绍
  3. React Native专题-江清清
  4. Spark UI (基于Yarn) 分析与定制
  5. git相关使用技巧和问题
  6. python实现指定目录下批量文件的单词计数:并发版本
  7. Log4js 工作原理及代码简析
  8. 20145326 《Java程序设计》课程总结
  9. double、float等多字节数据处理
  10. ccf 行车路线