图论问题--求哈密尔顿回路的问题
2016-04-28 17:34
316 查看
题目大意:给一个含有 n(2≤n≤1000) 个点的无向图,图中每个顶点至少有 (n+1)/2 个相邻点,让求一条 Hamilton 回路 注意到 "每个顶点至少有 (n+1)/2 个相邻点" 这句话,满足 Ore 定理,直接构造解即可,构造的方法就是在证明定理 2 时使用的方法
#include <cstring> #include <cstdio> #include <iostream> #include <list> #include<stdio.h> using namespace std; struct Hamilton_Circuit { static const int N=1006; bool G , vs ; int n, next , head, tail; void init(int _n) { n=_n; memset(G, 0, sizeof G); } void DFS_Head(int u) { vs[u]=1; for(int i=0; i<n; i++) if(G[i][u] && !vs[i]) { next[i]=u; DFS_Head(i); return; } head=u; } void DFS_Tail(int u) { vs[u]=1; for(int i=0; i<n; i++) if(G[u][i] && !vs[i]) { next[u]=i; DFS_Tail(i); return; } tail=u; } void Reverse(int u) { for(int i=next[u], temp, last=-1; i!=-1; i=temp) { temp=next[i]; next[i]=last; last=i; } int temp=tail; tail=next[u]; next[u]=temp; } int Find(int u) { for(int i=head; i!=-1; i=next[i]) { if(G[u][next[i]]) return i; } return -1; } bool Extend(int u) { if(G[u][head]) { next[u]=head; return 1; } int pre=Find(u); if(pre==-1) return 0; next[u]=next[pre]; next[tail]=head; next[tail=pre]=-1; return 1; } void Solve() { memset(next, -1, sizeof next); memset(vs, 0, sizeof vs); DFS_Head(0), DFS_Tail(0); int Len=1; for(int i=head; i!=tail; i=next[i], Len++); for(int i; 1; ) { if(!G[tail][head]) { for(i=next[head]; !(G[i][tail] && G[next[i]][head]); i=next[i]); Reverse(i); } if(Len==n) break; for(i=0; i<n; i++) if(!vs[i] && Extend(i)) { head=i, vs[i]=1, Len++; break; } } } void PRINT() { for(int i=head; head!=0; i=next[i]) { next[tail]=head; tail=head; head=next[head]; next[tail]=-1; } for(int i=head; i!=-1; i=next[i]) { printf("%d", i+1); if(next[i]==-1) printf(" 1\n"); else printf(" "); } } }; Hamilton_Circuit fuck; int n; int main() { //scanf("%d", &n); std::cin>>n; fuck.init(n); for(int i=0; i<n; i++) { for(int x; ; ) { //scanf("%d", &x); std::cin>>x; fuck.G[i][x-1]=1; x=getchar(); if(x=='\n' || x=='\r' || x==EOF) break; } } fuck.Solve(); fuck.PRINT(); return 0; }
相关文章推荐
- 二进制转化
- 关于java的递归写法,经典的Fibonacci数的问题
- 《ArcGIS Runtime SDK for Android开发笔记》——(13)、图层扩展方式加载Google地图
- CodeSmith和PowerDesigner的使用安装和数据库创建(原创系列教程)
- 小木的智慧屋--微信公众号的推广案例分析(1)
- NIO java
- 委托中的协变和逆变(C# 编程指南)
- Codeforces 237B Young Table 【构造】
- 机器学习算法----贝叶斯网络
- Unity3D 动态创建Mesh
- sqlite3中 timestamp使用
- iOS开发多线程篇—多线程简单介绍
- 优秀程序员的十个习惯
- SearchView基本功能用法
- hibernate之自定义数据类型
- 发布cocoapods
- 当孩子伸手向你要钱时,千万不能这样做,一辈子的阴影。
- 盲打练习
- 二进制数转化
- 十进制转化为十六进制