哈密頓迴路模版
找一條哈密頓迴路。
一個無向圖,若每個點連到其他的一半或一半以上的點,則這個圖一定存在哈密頓迴路
(就是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 題目描述 由於臨近廣