漢密爾頓迴路求解
漢密爾頓通路:給定圖G,若存在一條經過圖中的每個頂點一次且僅一次的通路,則稱這條
通路為漢密爾頓通路。
漢密爾頓迴路:若存在一條迴路,經過圖中的每個頂點一次且僅一次,則
稱這條迴路為漢密爾頓迴路。
漢密爾頓圖:具有漢密爾頓迴路的圖稱為漢密爾頓圖。
zoj 2398 poj 2288
地圖中有許多島嶼 沿著橋訪問每個島嶼一次且僅一次的路徑
每個島嶼還有相應的權值 根據路徑 會有相應的求值方式
求出最大的權值和以及路徑的數目
使用二進位制位表示路徑狀態 用狀態值記錄 權值和路徑數
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <string.h> #include <string> #define eps 1e-8 #define op operator #define MOD 10009 #define MAXN 13 #define INF 0x7fffffff #define MEM(a,x) memset(a,x,sizeof a) #define ll long long #define MAXSTATUS 1<<13//狀態最大數目 using namespace std; ll dp[MAXSTATUS][MAXN][MAXN]; ll ways[MAXSTATUS][MAXN][MAXN]; ll value[MAXN]; bool link[MAXN][MAXN]; int nislands; ll maxvalue; //最好的三角漢密爾頓迴路路徑的權值 ll maxways;//最多路徑數目 void init() { int nbridges; scanf("%d%d",&nislands,&nbridges); for(int i=0;i<nislands;i++) scanf("%lld",&value[i]); if(nislands==1) return; MEM(dp,-1); MEM(ways,0); MEM(link,0); for(int i=0;i<nbridges;i++) { int row,col; scanf("%d%d",&row,&col); row--; col--; link[row][col]=1; link[col][row]=1; dp[(1<<row)|(1<<col)][row][col]=value[row]+value[col]+value[row]*value[col]; dp[(1<<row)|(1<<col)][col][row]=value[row]+value[col]+value[row]*value[col]; ways[(1<<row)|(1<<col)][row][col]=1; ways[(1<<row)|(1<<col)][col][row]=1; } } void solve() { ll tmp; int nextstatus; if(nislands==1) { maxvalue=value[0]; maxways=1; return; } for(int s=0;s<(1<<nislands);s++) { for(int i=0;i<nislands;i++) { if(s&(1<<i)) { for(int j=0;j<nislands;j++) { if(i!=j&&(s&(1<<j))&&dp[s][i][j]>-1) { for(int k=0;k<nislands;k++) { if(!(s&(1<<k))&&link[i][k]==1) { nextstatus=s|(1<<k); tmp=dp[s][i][j]+value[k]+value[i]*value[k]; if(link[j][k]==1) tmp+=value[i]*value[j]*value[k]; if(dp[nextstatus][k][i]==tmp) ways[nextstatus][k][i]+=ways[s][i][j]; else if(dp[nextstatus][k][i]<tmp) { dp[nextstatus][k][i]=tmp; ways[nextstatus][k][i]=ways[s][i][j]; } } } } } } } } maxvalue=-1; maxways=0; int s=(1<<nislands)-1; for(int i=0;i<nislands;i++) { for(int j=0;j<nislands;j++) { if(!link[i][j]) continue; if(dp[s][i][j]==maxvalue) maxways+=ways[s][i][j]; else if(dp[s][i][j]>maxvalue) { maxways=ways[s][i][j]; maxvalue=dp[s][i][j]; } } } maxways/=2; } int main() { //freopen("ceshi.txt","r",stdin); int tc; scanf("%d",&tc); while(tc--) { init(); solve(); if(maxvalue==-1) printf("0 0\n"); else printf("%lld %lld\n",maxvalue,maxways); } return 0; }
相關推薦
漢密爾頓迴路求解
漢密爾頓通路:給定圖G,若存在一條經過圖中的每個頂點一次且僅一次的通路,則稱這條 通路為漢密爾頓通路。漢密爾頓迴路:若存在一條迴路,經過圖中的每個頂點一次且僅一次,則 稱這條迴路為漢密爾頓迴路。漢密爾頓圖:具有漢密爾頓迴路的圖稱為漢密爾頓圖。 zoj 2398 poj 2
漢密爾頓迴路
問題表面跟歐拉回路是差不多的,但至今也沒有人能給出漢密頓迴路的充分必要條件。老師說是什麼N P問題。。。反正就是沒有得證,特別難的意思。。。 一:定義: 漢密爾頓路:對於一個連通圖,如果你能夠從一個點開始,然後不重複地走過所有的點,這個路就是漢密爾頓路。 漢米爾頓迴路:對於一個連通圖,如
尋找漢密爾頓迴路(java版)
package hg; public class Hanmierdun { //結點的個數 public int n =5; public int b[] = new int[5];
漢密爾頓迴路問題
概述 這是自己這學期演算法課的實驗作業。下面給出漢密爾頓圖的定義。定義如下:對於連通圖G=(V,E),V1,V2,…,Vn是G 的一條通路,且圖中任意兩個頂點都可達,若 中每個頂點在該通路中出現且僅出現一次,則稱該通路為漢密爾頓通路。若 V1=Vn,則稱該通路
2018阿裏編程測驗題:最短漢密爾頓回路
ann 之間 math pre tar get 進行 public 訪問 N個城市,要求走一條最短的回路 import java.util.Arrays; import java.util.Scanner; public class Main { class Point
漢密爾頓圖與尤拉圖
漢密爾頓圖: 定義:哈密頓通路(迴路)與哈密頓圖 (Hamilton圖) 通過圖G的每個結點一次,且僅一次的通路(迴路),就是哈密頓通路(迴路)。存在哈密頓迴路的圖就是哈密頓圖 Granny's Bike 釋出時間: 2017年6月19日 00:27 時間限制:
F1巴西站漢密爾頓奪冠 維斯塔潘領跑套圈被撞
11月29日訊息,@北京商報從度小滿金融人士處獲悉,百度正式拿到准許經營證券期貨的許可證。據許可證顯示,機構名稱為北京百度百盈科技有限公司(下稱“百度百盈”),證券期貨業務經營範圍為基金銷售。而今年8月22日,根據北京證監局官網顯示,證監局已核准百度百盈證券投資基金銷售業務資格。 企查查資訊顯示,百度百盈成
漢密爾頓:維斯塔潘本來可以換一種處理方式
“90後”女大學生放棄北大保送復旦!她到底有多厲害? 東北網12月6日訊(記者 姜姍姍) 在東北農業大學有這樣一個自強不息的女大學生,她放棄北大直博被保送到復旦大學藥學院。她本科期間獲得國家獎學金、國家勵志獎學金、新東方自強獎學金、第一屆全國大學生生命聯賽國家二等獎……被評為黑龍江省“三好學生”。她就是生命
poj 2288 islands and Bridges(漢密爾頓環,狀壓dp)
Given a map of islands and bridges that connect these islands, a Hamilton path, as we all know, is a path along the bridges such that it v
【漢密爾頓、DP|狀態壓縮】POJ-2288 Islands and Bridges
Islands and Bridges Time Limit: 4000MS Memory Limit: 65536K Description Given a map of islands and bridges that connect these island
hdu 4337——poj 2438(哈密爾頓迴路求解模板)
轉:http://imlazy.ycool.com/post.2072698.html :設一個無向圖中有 N 個節點,若所有節點的度數都大於等於 N/2,則漢密爾頓迴路一定存在。注意,“N/2” 中的除法不是整除,而是實數除法。如果 N 是偶
組合補考的我且先裝個比,競賽圖中求漢密爾頓圈演算法設計
對於一個圖中是否存在一條哈密頓路,沒有可靠的充分必要條件(貌似鄰接矩陣恆式可以?),因此求哈密頓路是一個NP問題,一般要使用搜索和狀壓dp求解,但漢密爾頓迴路的存在有許多充分條件,即當圖滿足某些特定性質的時候,漢密爾頓迴路一定存在,而且可以根據一些演算法構造出來。
漢密爾頓路徑(哈密頓路徑)解析
漢密爾頓路徑(哈密頓路徑) 哈密頓路徑也稱作哈密頓鏈,指在一個圖中沿邊訪問每個頂點恰好一次的路徑。尋找這樣的一個路徑是一個典型的NP-完全(NP-complete)問題。後來人們也證明了,找一條哈密頓路的近似比為常數的近似演算法也是NP完全的. 演算法思路(
哈密爾頓道路與哈密爾頓迴路
簡介 1857年愛爾蘭數學家哈密爾頓發明了“周遊世界”玩具,用一個正十二面體的20個頂點表示世界上20個大城市,30條稜代表這些城市之間的道路。要求遊戲者從任意一個城市(即頂點)出發,延稜行走經過每個城市一次且只經過一次,最終返回出發地。哈密爾頓將此問題稱為周遊世界問題,並且作了肯定的回答。 以下是一種走
哈密爾頓環 dfs
spa 之間 ont font 表示 color const 代碼 輸入 ( ⊙ o ⊙ ) 題目: (⊙v⊙)嗯,代碼: 1 #include <cstdio> 2 #include <algorithm> 3 usin
poj 2280 Islands and Bridges 哈密爾頓路 狀壓dp
main dfs printf sca -i lin mes ios fine 題目鏈接 題意 給定一個\(N\)個點的無向圖,求一條哈密爾頓路徑\(C_1C_2...C_n\),使其\(value\)最大。 \(value\)的計算方式如下:\[\begin{aligne
高爾頓釘板與二項分布
src 基礎上 方法 其中 pos log n-k ges img 今天數學課上老師說高爾頓釘板符合高斯分布,然而直覺告訴我這是二項分布,只是二項分布的概率密度函數可以用高斯分布近似而已,其實和高斯分布(正態分布)沒什麽關系。 上圖是書上的原圖,如果我們把它的結構抽象成
虛擬幣挖礦黑產:“吃雞”外掛讓電腦中毒秒變僵屍礦工;希爾頓酒店將在8月嘗試數字貨幣支付
人生 ofo 維權 rac 頭部 mvt 討論 北京時間 財經 2018年7月23日 星期一貓寧艾瑞巴蒂,一起來看今天的區塊鏈早報…【區塊鏈高調早報】第31期文 | 梅林今日行情截止至北京時間早上6點行情 (數據來源:幣安交易所)比特幣 報 $7
Fortran:漢克爾積分數值方法
Module Hankel_trans implicit none contains !.. Fast Hankel Transform !.. New digital linear filters for Hankel J0 and J1 transforms !.. D Guptasarma
哈密爾頓道路與哈密爾頓回路
大於 顏色 遊戲 tid 出發 證明 之間 image 有一個 簡介 1857年愛爾蘭數學家哈密爾頓發明了“周遊世界”玩具,用一個正十二面體的20個頂點表示世界上20個大城市,30條棱代表這些城市之間的道路。要求遊戲者從任意一個城市(即頂點)出發,延棱行走經過每個城市一次且