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...