1. 程式人生 > >哈密頓迴路模版

哈密頓迴路模版

找一條哈密頓迴路。

一個無向圖,若每個點連到其他的一半或一半以上的點,則這個圖一定存在哈密頓迴路

(就是5個點,則每個點至少有3條邊)

HDU 4337的裸題

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int N = 155;

int n, m;
bool mp[N][N];

int S, T, top, Stack[N];
bool vis[N];
void _reverse(int l,int r) {
	while (l<r)
		swap(Stack[l++],Stack[r--]);
}
void expand() {
	while(1) {
		bool flag = 0;
		for (int i=1; i<=n && false == flag; i++)
			if (!vis[i] && mp[T][i])
			{
				Stack[top++]=i;
				T=i;
				flag = vis[i] = 1;
			}
		if (!flag) return;
	}
}
void hamiltun(int Start){
	memset(vis, 0, sizeof vis);

	S = Start;
	for(T=2; T<=n; T++) //任意找兩個相鄰的節點S和T
		if (mp[S][T]) break; 
	top = 0;
	Stack[top++]=S;
	Stack[top++]=T;
	vis[S] = vis[T] = true;
	while (1)
	{
		expand(); //在它們基礎上擴展出一條儘量長的沒有重複節點的路徑:步驟1
		_reverse(0,top-1);
		swap(S,T);
		expand(); //在它們基礎上擴展出一條儘量長的沒有重複節點的路徑
		int mid=0;
		if (!mp[S][T]) //若S與T不相鄰,可以構造出一個迴路使新的S和T相鄰
		{
			//設路徑S→T上有k+2個節點,依次為S,v1,v2…… vk和T.
			//可以證明存在節點vi,i∈[1,k),滿足vi與T相鄰,且vi+1與S相鄰
			for (int i=1; i<top-2; i++)
				if (mp[Stack[i]][T] && mp[Stack[i+1]][S])
				{
					mid=i+1; break;
				}
			//把原路徑變成S→vi→T→vi+1→S,即形成了一個迴路
			_reverse(mid,top-1);
			T=Stack[top-1];
		}
		if (top==n) break;
		//現在我們有了一個沒有重複節點的迴路.如果它的長度為N,則漢密爾頓迴路就找到了
		//否則,由於整個圖是連通的,所以在該回路上,一定存在一點與迴路以外的點相鄰
		//那麼從該點處把迴路斷開,就變回了一條路徑,再按照步驟1的方法儘量擴充套件路徑
		for (int i = 1, j; i <= n; i++)
			if (!vis[i])
			{
				for (j=1; j<top-1; j++)
					if (mp[Stack[j]][i]) break;
				if (mp[Stack[j]][i])
				{
					T=i; mid=j;
					break;
				}
			}
		S=Stack[mid-1];
		_reverse(0,mid-1);
		_reverse(mid,top-1);
		Stack[top++]=T;
		vis[T]=true;
	}
}

int main() {
	while (cin>>n>>m) {
		memset(mp, 0, sizeof mp);
		for (int i = 1, u, v; i <= m; i++) {
			scanf("%d %d",&u, &v);
			mp[u][v] = mp[v][u] = 1;
		}
		hamiltun(1);
		for (int i = 0; i < top; i++)
			printf("%d%c", Stack[i], i==top-1?'\n':' ');
	}
	return 0;
}


相關推薦

哈密迴路模版

找一條哈密頓迴路。 一個無向圖,若每個點連到其他的一半或一半以上的點,則這個圖一定存在哈密頓迴路 (就是5個點,則每個點至少有3條邊) HDU 4337的裸題 #include <cstdio> #include <cstring> #includ

哈密迴路模板

#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=405; int ans[maxn],g[max

【Codeforces】【圖論】【數量】【哈密迴路】Fake bullions (CodeForces - 804F)

題意 有n個黑幫(gang),每個黑幫有siz[i]個人,黑幫與黑幫之間有有向邊,並形成了一個競賽完全圖(即去除方向後正好為一個無向完全圖)。在很多年前,有一些人蔘與了一次大型搶劫,參與搶劫的人都獲得了一個真金條。 在這些年間,不同的黑幫之間進行了交易。具體過程是: 在時刻i,假如有一條邊是u->

基於回溯法尋找哈密迴路

回溯法是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。 在包含問題的所有解的解空間樹中,按照深度優先搜尋的策

歐拉回路&特殊圖下的哈密迴路題集【夏天的風】

歐拉回路 【HDU】 1878歐拉回路  判斷30181116Play on Words2894DeBruijin 茲鼓歐拉回路1956Sightseeing tour 混合尤拉3472HS BDC 混合尤拉==========================

【例題】【圖論(哈密迴路)&DP(狀壓)】

1、 NKOJ 3707 送外賣 時間限制 : - MS 空間限制 : 65536 KB 評測說明 : 時限2000ms 問題描述 有一個送外賣的,他手上有n份訂單,他要把n份東西

歐拉回路&特殊圖下的哈密迴路題集

歐拉回路 【HDU】 1878歐拉回路  判斷3018Ant Trip 一筆畫問題   1116Play on Words2894DeBruijin 茲鼓歐拉回路1956Sightseeing tour 混合尤拉3472HS BDC 混合尤拉=========

哈密哈密迴路 哈密通路(Hamilton)

概念:   哈密頓圖:圖G的一個迴路,若它通過圖的每一個節點一次,且僅一次,就是哈密頓迴路.存在哈密頓迴路的圖就是哈密頓圖.哈密頓圖就是從一點出發,經過所有的必須且只能一次,最終回到起點的路徑.圖中有的邊可以不經過,但是不會有邊被經過兩次.   與尤拉圖的區別:尤拉圖討論

哈密道路與哈密迴路

簡介 1857年愛爾蘭數學家哈密爾頓發明了“周遊世界”玩具,用一個正十二面體的20個頂點表示世界上20個大城市,30條稜代表這些城市之間的道路。要求遊戲者從任意一個城市(即頂點)出發,延稜行走經過每個城市一次且只經過一次,最終返回出發地。哈密爾頓將此問題稱為周遊世界問題,並且作了肯定的回答。 以下是一種走

hdu 4337——poj 2438(哈密迴路求解模板)

               轉:http://imlazy.ycool.com/post.2072698.html :設一個無向圖中有 N 個節點,若所有節點的度數都大於等於 N/2,則漢密爾頓迴路一定存在。注意,“N/2” 中的除法不是整除,而是實數除法。如果 N 是偶

無向哈密迴路Dirac 定理證明和競賽圖為哈密通路的證明過程

Dirac 定理: 設一個無向圖中有 N 個節點,若所有節點的度數都大於等於 N/2,則漢密爾頓迴路一定存在。注意,“N/2” 中的除法不是整除,而是實數除法。如果 N 是偶數,當然沒有歧義;如果 N 是奇數,則該條件中的 “N/2” 等價於 “⌈N/2⌉”。 而我想

POJ 2288 Islands And Bridges 狀態壓縮dp+哈密回路

pac -1 path max def %d 註意 sca can 題意:n個點 m條邊的圖,路徑價值定義為相鄰點乘積,若路路徑c[i-1]c[i]c[i+1]中c[i-1]-c[i+1]有邊 則價值加上三點乘積找到價值最大的哈密頓回路,和相應的方法數n<=13.暴力

BZOJ.4727.[POI2017]Turysta(哈密路徑/回路 競賽圖)

() markdown def clas tps solution blog turn htm 題目鏈接 \(Description\) 給出一個n個點的有向圖,任意兩個點之間有且僅一條有向邊。對於每個點v,求出從v出發的一條經過點數最多,且沒有重復經過同一個點一次以上的簡

CDOJ 1960 構造哈密路徑

AI tdi AC 希望 iostream CA mes return turn 題意: 給定n個點的有向完全圖,希望通過其中n-1條邊將n個點串起來(2<=n<=1000) 歐拉路徑:經過所有邊且只經過一次 哈密頓路徑:經過所有點且只經過一次 思路:

BZOJ4727 [POI2017]Turysta 【競賽圖哈密路徑/回路】

指向 air const 排序 space con res tps 維護 題目鏈接 BZOJ4727 題解 前置芝士 1.競賽圖存在哈密頓路徑 2.競賽圖存在哈密頓回路,當且僅當它是強聯通的 所以我們將圖縮點後,拓撲排序後一定是一條鏈,且之前的塊內的點和之後塊內的點的邊

UESTC 1960 鹹魚自畫像 構造哈密通路

cto problem class 競賽圖 algo iostream %s tdi 連通 題目:http://www.qscoj.cn/#/problem/show/1960 有向圖完全圖是競賽圖。 定理: 競賽圖一定存在哈密頓路徑 競賽圖存在哈密頓回路 充要條件是強

HDU 2181 哈密繞行世界問題

string.h names 哈密頓繞行世界問題 pri eof algo ems sample output http://acm.hdu.edu.cn/showproblem.php?pid=2181 Problem Description 一個規則的實心十二面體,

HDU - 2181 哈密繞行世界問題(簡單dfs)

https://blog.csdn.net/libin56842/article/details/15028427 #include<bits/stdc++.h> using namespace std; int mp[25][5]; bool VIS[25]; int ans[25

圖論一模版

圖論一頓套模版 https://ac.nowcoder.com/acm/contest/283/H 題目描述 由於臨近廣西大學建校90週年校慶,西大開始了喜聞樂見的校園修繕工程! 然後問題出現了,西大內部有許許多多的道路,據統計有N棟樓和M條道路

“東信杯”廣西大學第一屆程式設計競賽(同步賽)H 圖論一模版 【最短路 求對數技巧】

傳送門:https://ac.nowcoder.com/acm/contest/283/H 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 131072K,其他語言262144K 64bit IO Format: %lld 題目描述  由於臨近廣