1. 程式人生 > >漢密爾頓迴路求解

漢密爾頓迴路求解

漢密爾頓通路:給定圖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條棱代表這些城市之間的道路。要求遊戲者從任意一個城市(即頂點)出發,延棱行走經過每個城市一次且