bzoj1097 POI2007 旅遊景點atr

2021-08-14 21:13:26 字數 2476 閱讀 9455

description

fgd想從成都去上海旅遊。在旅途中他希望經過一些城市並在那裡欣賞風景,品嚐風味小吃或者做其他的有趣

的事情。經過這些城市的順序不是完全隨意的,比如說fgd不希望在剛吃過一頓大餐之後立刻去下乙個城市登山,

而是希望去另外什麼地方喝下午茶。幸運的是,fgd的旅程不是既定的,他可以在某些旅行方案之間進行選擇。由於

fgd非常討厭乘車的顛簸,他希望在滿足他的要求的情況下,旅行的距離盡量短,這樣他就有足夠的精力來欣賞風

景或者是泡mm了^_^.整個城市交通網路包含n個城市以及城市與城市之間的雙向道路m條。城市自1至n依次編號,道

路亦然。沒有從某個城市直接到它自己的道路,兩個城市之間最多只有一條道路直接相連,但可以有多條連線兩個

城市的路徑。任意兩條道路如果相遇,則相遇點也必然是這n個城市之一,在中途,由於修建了立交橋和下穿隧道

,道路是不會相交的。每條道路都有乙個固定長度。在中途,fgd想要經過k(k<=n-2)個城市。成都編號為1,上海

編號為n,而fgd想要經過的n個城市編號依次為2,3,…,k+1.舉例來說,假設交通網路如下圖。fgd想要經過城市2,3,

4,5,並且在2停留的時候在3之前,而在4,5停留的時候在3之後。那麼最短的旅行方案是1-2-4-3-4-5-8,總長度為1

9。注意fgd為了從城市2到城市4可以路過城市3,但不在城市3停留。這樣就不違反fgd的要求了。並且由於fgd想要

走最短的路徑,因此這個方案正是fgd需要的。

input

第一行包含3個整數n(2<=n<=20000),m(1<=m<=200000),k(0<=k<=20),意義如上所述。

output

只包含一行,包含乙個整數,表示最短的旅行距離。

sample input

8 15 4

1 2 3

1 3 4

1 4 4

1 6 2

1 7 3

2 3 6

2 4 2

2 5 2

3 4 3

3 6 3

3 8 6

4 5 2

4 8 6

5 7 4

5 8 6

3 2 3

3 4

3 5

sample output

19 ***卡常題 除錯了很久

因為k<=20所以首先dijkstra列舉所有的起點 然後算出20*20個點的最短路 記錄下來 然後就可以一般狀壓的套路去搞了設dp[i][s]表示到達這個點狀態為s最小狀態 最後我列舉一下所有點結束的情況再加上他們去終點的最短路取min即可 注意卡常去掉冗餘的狀態..比如當前這個點 這個狀態最短路是inf那我就不去列舉了

#include

#include

#include

#include

#define n 22000

#define m 220000

#define inf 0x3f3f3f3f

#define pa pair

using

namespace

std;

inline

char gc()

return *s++;

} inline

int read()

struct nodedata[m<<1];

int dis[22][n],mp[25][25],mp1[25],n,m,k,h[n],l_dis,num,bin[25],dp[21][1

<<20],sta[25];

bool flag[n];

void dijkstra(int u)memset(dis,0x3f,sizeof(dis));

if (!k)

for (int i=1;i<=k+1;++i) dijkstra(i);int g=read();

for (int i=1;i<=g;++i)

for (int s=1;s<=bin[k]-1;++s)

for (int j=0;jfor (int i=0;iif (!sta[i]) dp[i][bin[i]]=dis[1][i+2];

for (int s=1;sfor (int i=0;iif (!(bin[i]&s)) continue;if (dp[i][s]==inf) continue;

for (int to=0;toif (bin[to]&s) continue;if ((s&sta[to])!=sta[to]) continue;

dp[to][s|bin[to]]=min(dp[to][s|bin[to]],dp[i][s]+dis[i+2][to+2]); }}

}int ans=0x3f3f3f3f;

for (int i=0;i1]+dis[i+2][n]);

printf("%d",ans);

return

0;}

BZOJ 1111 POI2007 四進製的天平

茲磁夥伴們刷poi 詳細題解在 後 include include include include include include include include include include using namespace std const int maxn 2100 const int in...

bzoj1105 POI2007 石頭花園SKA

很顯然的結論,x,y 與 y,x 關於 y x 對稱 那麼就可以知道所有點一定是在直線的一側 暫時不考慮移動石子的代價 這樣得出來的就是最小的籬笆長度 有一些點可以不需要動,那麼第二問分四種情況討論即可 include include include includeusing namespace s...

POI 2007 旅遊景點

題目鏈結 演算法 首先,用dijkstra演算法求出2 k 1到每個點的最短路 然後,我們用f s i 表示目前停留城市集合為s,現在在城市i,最短的路徑 狀壓dp即可 includeusing namespace std define maxn 20010 define maxm 200010 d...