bzoj2324 ZJOI2011 營救皮卡丘

2021-08-14 07:08:41 字數 2733 閱讀 5140

(

description

皮卡丘被火箭隊用**的計謀搶走了!這三個壞傢伙還給小智留下了赤果果的挑釁!為了皮卡丘,也為了正義,小智和他的朋友們義不容辭的踏上了營救皮卡丘的道路。

火箭隊一共有n個據點,據點之間存在m條雙向道路。據點分別從1到n標號。小智一行k人從真新鎮出發,營救被困在n號據點的皮卡丘。為了方便起見,我們將真新鎮視為0號據點,一開始k個人都在0號點。

由於火箭隊的重重布防,要想摧毀k號據點,必須按照順序先摧毀1到k-1號據點,並且,如果k-1號據點沒有被摧毀,由於防禦的連鎖性,小智一行任何乙個人進入據點k,都會被發現,並產生嚴重後果。因此,在k-1號據點被摧毀之前,任何人是不能夠經過k號據點的。

為了簡化問題,我們忽略戰鬥環節,小智一行任何乙個人經過k號據點即認為k號據點被摧毀。被摧毀的據點依然是可以被經過的。

k個人是可以分頭行動的,只要有任何乙個人在k-1號據點被摧毀之後,經過k號據點,k號據點就被摧毀了。顯然的,只要n號據點被摧毀,皮卡丘就得救了。

野外的道路是不安全的,因此小智一行希望在摧毀n號據點救出皮卡丘的同時,使得k個人所經過的道路的長度總和最少。

請你幫助小智設計乙個最佳的營救方案吧!

input

第一行包含三個正整數n,m,k。表示一共有n+1個據點,分別從0到n編號,以及m條無向邊。一開始小智一行共k個人均位於0號點。

接下來m行,每行三個非負整數,第i行的整數為ai,bi,li。表示存在一條從ai號據點到bi號據點的長度為li的道路。

output

僅包含乙個整數s,為營救皮卡丘所需要經過的最小的道路總和。

sample input

3 4 2

0 1 1

1 2 1

2 3 100

0 3 1

sample output

3 【樣例說明】

小智和小霞一起前去營救皮卡丘。在最優方案中,小智先從真新鎮前往1號點,接著前往2號據點。當小智成功摧毀2號據點之後,小霞從真新鎮出發直接前往3號據點,救出皮卡丘。

hint

對於100%的資料滿足n ≤ 150, m ≤ 20 000, 1 ≤ k ≤ 10, li ≤ 10 000, 保證小智一行一定能夠救出皮卡丘。至於為什麼k ≤ 10,你可以認為最終在小智的號召下,小智,小霞,小剛,小建,小遙,小勝,小光,艾莉絲,天桐,還有去日本旅遊的黑貓警長,一同前去大戰火箭隊。

source

day2

首先這題 很神 再其次 跪膜icefox 大佬 秒題神速啊

首先這個問題我覺得蠻像poj2594的 類似最小權值的可重路線 但是現在我們這題給的是無向圖 並且 要求滿足乙個類似dag的東西 就是想要訪問k 那麼必須把1~k-1的都訪問完 那麼要保證我每個點第一次被訪問只被訪問一次 那麼就和poj2594一模一樣了 所以建圖方法也相同 其次 我還可以預處理一下 某個點 從所有比他小的點轉移過來需要的最小代價是多少 我是跑了n遍dijkstra求出來的這樣的話 我就可以get我如果前面的點都訪問過了 我到達我想要的那個點的最小代價是多少啊然後 加邊的時候我是s->0 權值為k 費用為0 s->每個節點權值為1 費用為0 每個節點的另乙個匹配點到t的權值為1 費用為0 然後每個點都向序號比他大的點去連邊 比如權值為1 然後費用為i->j的最小路經長度 然後跑最小費用最大流即可

#include

#include

#include

#include

#include

#define pa pair

#define n 330

#define inf 0x3f3f3f3f

using

namespace

std;

inline

char gc()

return *s++;

}inline

int read()

int num=0,h[n],f[n],flag[n],pre[n],path[n],s,t,n,mp[n][n],m,k;

struct nodedata[n*n<<2],ed[n*n<<2];

inline

void insert2(int x,int y,int z)

inline

void insert1(int x,int y,int z,int c)

inline

void dijkstra(int s)

inline

bool spfa()

}}if (pre[t]==-1) return

0;else

return1;}

int main()

// for (int i=1;i<=num;++i) printf("%d %d %d\n",ed[i].x,ed[i].y,ed[i].z);

for (int i=1;i<=n;++i) dijkstra(i);num=1;memset(h,0,sizeof(h));insert1(s,0,k,0);

for (int i=1;i<=n;++i) insert1(s,i,1,0),insert1(i+n,t,1,0);

for (int i=0;i<=n;++i)

for (int j=i+1;j<=n;++j) if (i!=j&&mp[i][j]!=inf) insert1(i,j+n,1,mp[i][j]);

int ans=0;

while(spfa())

}printf("%d",ans);

return

0;}

2324 ZJOI2011 營救皮卡丘

題目鏈結 題目大意 n 1個城市 0到n 初始時k個人都在0城市。城市之間有距離。要求 1 遍歷完n個城市 有乙個人遍歷了某個城市就算這個城市被遍歷了 2 遍歷i城市前必須遍歷完前i 1個城 市,並且在遍歷前i 1個城市時不能經過大於等於i的城市。在滿足 1 2 的前提下使得k個人走的總距離最小 題...

BZOJ 2324 營救皮卡丘

思路 最小費用最大流 考慮設陣列d k i j 代表只用前k個城市,i到j的最短路 然後可以這樣建圖 s 0 流量為k,費用為0 i i n 流量為inf,費用為0 i n t 流量為1 i n j 流量為inf,費用為d j i j s i 流量為1,費用為0 代表如果乙個人到了i城市,它可以繼續...

bzoj 2324 最小費用最大流

time limit 10 sec memory limit 256 mb submit 2137 solved 873 submit status discuss 皮卡丘被火箭隊用 的計謀搶走了!這三個壞傢伙還給小智留下了赤果果的挑釁!為了皮卡丘,也為了正義,小智和他的朋友們義不容辭的踏上了營救皮...