哈密頓回路徐裸, DP解法

題目鏈接:https://www.patest.cn/contests/gplt/L3-015
簡介:哈密頓路除了暴搜羊初,當(dāng)然還可以DP,只不過需要2n的空間街立,復(fù)雜度是O(n*(2n)), 暴搜不需要那么多舶衬,但復(fù)雜度為O(n!)。
ACFUN群里的講解:

因?yàn)槭莻€(gè)環(huán)肯定 1 是第一個(gè)點(diǎn)
然后你就找一條鏈就行了赎离,dp[mask][i] 表示 mask 集合的最后一個(gè)點(diǎn)是 i 的路徑是否存在
第二維還可以壓位不過這個(gè)不重要

所以這實(shí)際上就是求個(gè)排列dp约炎。
排列dp相關(guān)題目:http://www.reibang.com/p/fdf03a78176b 的2題3題。
但這題還是有幾個(gè)坑點(diǎn):

  1. i勝過j 是 tb[i][j]=='W'||tb[j][i]=='L' ,tb[i][j] 和tb[j][i] 不相關(guān)。
  2. n的范圍好像是21...
  3. 打印路徑還是有難度和坑點(diǎn)的圾浅,首先逆推建能到終點(diǎn)的路徑圖掠手,然后從起點(diǎn)正推,坑點(diǎn)就是假設(shè)每個(gè)子集為圖上的點(diǎn)狸捕,每次選則的球隊(duì)為邊喷鸽,并不是只要到達(dá)這結(jié)點(diǎn),由這結(jié)點(diǎn)出發(fā)的任意邊的任意邊都可以選,還和你到這點(diǎn)最后走的邊有關(guān)
    代碼
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXS = 1<<21;
const int MAXN = 21;
const int INF = 0x3f3f3f3f;
typedef pair<int,int> pii;
int dp[MAXS], G[MAXS][MAXN], n;
char tb[MAXN][MAXN];
inline bool win(int x, int y) {
    return tb[x][y]=='W'||tb[y][x]=='L';
}
inline bool of(int x, int st) {
    return (1<<x)&st;
}
bool bfs() {
    queue<pii> q;
    while(q.size()) q.pop();
    memset(G, 0x3f, sizeof(G));
    int t=(1<<n)-1;
    bool ret=false;

    for(int i=0; i<n; ++i)
        if(of(i,dp[t])&&win(i,0))
            q.push(make_pair(t,i));
    while(q.size()) {
        pii u= q.front();
        q.pop();
        int nst = u.first^(1<<u.second);
        if(nst) {
            for(int i=0; i<n; ++i)
                if(of(i,dp[nst])&&win(i,u.second)) {
                    if(G[nst][i]==INF) q.push(make_pair(nst,i));
                    G[nst][i] = min(G[nst][i], u.second);
                }
        }
        else {
            ret = true;
            G[0][0] = 0;
        }
    }
    return ret;
}
void printpath() {
    int st=0, p=0;
    while(G[st][p]<INF) {
        if(st) putchar(' ');
        printf("%d", G[st][p]+1);
        p = G[st][p];
        st |= 1<<p;
    }
    puts("");
}
int main() {
    scanf("%d", &n);
    for(int i=0; i<n; ++i)
        scanf("%s", tb[i]);
    dp[1] = 1;
    for(int st=1; st<(1<<n)-1; ++st) {
        int b[MAXN], sz=0;
        for(int i=0; i<n; ++i)
            if(of(i,dp[st])) b[sz++] = i;
        for(int i=0; i<sz; ++i)
            for(int j=0; j<n; ++j)
                if(win(b[i],j)&&!of(j,st))
                    dp[st|(1<<j)] |= (1<<j);
    }
    if(bfs()) printpath();
    else puts("No Solution");
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末灸拍,一起剝皮案震驚了整個(gè)濱河市做祝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸡岗,老刑警劉巖混槐,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轩性,居然都是意外死亡声登,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門揣苏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悯嗓,“玉大人,你說我怎么就攤上這事卸察「” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵坑质,是天一觀的道長合武。 經(jīng)常有香客問我,道長涡扼,這世上最難降的妖魔是什么眯杏? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮壳澳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茫经。我一直安慰自己巷波,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布卸伞。 她就那樣靜靜地躺著抹镊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荤傲。 梳的紋絲不亂的頭發(fā)上垮耳,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼终佛。 笑死俊嗽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铃彰。 我是一名探鬼主播绍豁,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牙捉!你這毒婦竟也來了竹揍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤邪铲,失蹤者是張志新(化名)和其女友劉穎芬位,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體带到,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昧碉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阴孟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晌纫。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖永丝,靈堂內(nèi)的尸體忽然破棺而出锹漱,到底是詐尸還是另有隱情,我是刑警寧澤慕嚷,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布哥牍,位于F島的核電站,受9級(jí)特大地震影響喝检,放射性物質(zhì)發(fā)生泄漏嗅辣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一挠说、第九天 我趴在偏房一處隱蔽的房頂上張望澡谭。 院中可真熱鬧,春花似錦损俭、人聲如沸蛙奖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雁仲。三九已至,卻和暖如春琐脏,著一層夾襖步出監(jiān)牢的瞬間攒砖,已是汗流浹背缸兔。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吹艇,地道東北人惰蜜。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像掐暮,于是被迫代替她去往敵國和親蝎抽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容