【題目背景】
公元215年,劉備取益州,孫權令諸葛瑾找劉備索要荊州。劉備不答應,孫權極為惱恨,便派呂蒙率軍取長沙、零陵、桂陽三郡。長沙、桂陽蜀將當即投降。劉備得知後,親自從成都趕到公安(今湖北公安),派大將關羽爭奪三郡。孫權也隨即進駐陸口,派魯肅屯兵益陽,抵擋關羽。雙方劍拔弩張,孫劉聯盟面臨破裂,在這緊要關頭,魯肅為了維護孫劉聯盟,不給曹操可乘之機,決定當面和關羽商談。「肅邀羽相見,各駐兵馬百步上,但諸將軍單刀俱會」。雙方經過會談,緩和了緊張局勢。隨後,孫權與劉備商定平分荊州,「割湘水為界,於是罷軍」,孫劉聯盟因此能繼續維持。
【問題描述】
關羽受魯肅邀請,為了大局,他決定冒險赴會。他帶著侍從周倉,義子關平,騎著赤兔馬,手持青龍偃月刀,從軍營出發了,這就是歷史上赫赫有名的「單刀赴會」。關羽平時因為軍務繁重,決定在這次出行中拜訪幾個多日不見的好朋友。然而局勢緊張,這次出行要在限定時間內完成,關公希望你能夠幫助他安排一下行程,安排一種出行方式,使得從軍營出發,到達魯肅處赴會再回來,同時拜訪到盡可能多的朋友,在滿足這些條件下行程最短。注意拜訪朋友可以在赴會之前,也可以在赴會之後。現在給出地圖,請你完成接下來的任務。
我們發現k非常的小,這種問題是經典的狀壓dp,又因為是無環圖,所以可以用dijk先算出每個關鍵點到其他點的距離,再呼叫tsp問題的方法即可
(這裡說一下:dijk+heap很好寫,信不信比你的spfa還短,而且可以在負權圖上面跑!但是效率會下降很多)
#pragma gcc opitmize("o3")
#pragma g++ opitmize("o3")
#include
#include
#include
#include
using
namespace
std;
struct node x;
struct edge g[100010];
int h[10010],d[20][10010],d2[20][20];
int n,m,k,t,cnt=0,w[20],f[20][1
<<18];
inline
bool gmin(int& a,int b)
inline
bool
operator
< (node a,node b)
inline
int tot(int s,int c=0)
inline
void adj(int x,int y,int c); h[x]=cnt; }
void dijk(int* d,int s));
for(int u;!q.empty();)); }}
int main()
memset(d,63,sizeof d);
memset(f,63,sizeof f);
w[0]=1; w[++k]=n;
dijk(d[0],1); dijk(d[k],n);
for(int i=1;iscanf("%d",w+i);
dijk(d[i],w[i]);
for(int j=0;jfor(int j=0;j1
<0][j];
} for(int s=0;s<(1
<1);++s)
for(int i=0;i<=k;++i)
if(s&(1
if(i!=j&&(s&(1
<1
for(int s=1
<1
<1);++s)
if((s&(1
<1))
}} if(~mx) printf("%d %d",mx,ml); else
puts("-1");
}
洛谷 3907 圈的異或 題解
部落格觀賞效果更佳 給定乙個無向圖,點數和邊數 50 50 5 0 但你完全珂以當成2e5 2e52e 5來做 邊有邊權,判斷這個圖是否每個環的邊權的異或和都是000。暴力找每個環,根據dfs dfsdf s序維護異或和,然後用字首和維護這個環的異或和,判斷是否為0 00即珂。首先維護dfs dfs...
洛谷 P3907 圈的異或
給出無向圖g,邊 ai,bi 的權是ci,判斷下列性質是否成立 對於任意圈c,其邊權的異或和是0 輸入格式 第1 行,1 個整數t,表示資料的組數。每組資料第1 行,2 個整數 n,m,表示圖g 點和邊的數量。m 行,每行3 個整數 ai,bi,ci,輸出格式 對每個資料輸出一行,yes 或者 no...
BZOJ 3907 網格 組合數學
大家說他是卡特蘭數,其實也不為過,一開始只是用卡特蘭數來推這道題,一直沒有懟出來,後來發現其實卡特蘭數只不過是一種組合數學,我們可以退一步直接用組合數學來解決,這道題運用組合數的思想主要用到補集與幾何法。假設以矩形左下角為座標原點,以下所說路徑均滿足只能向右或向上走 我們假設原矩陣為a,那麼他關於l...