BZOJ2324 營救皮卡丘,費用流

2021-07-11 11:05:00 字數 1025 閱讀 4932

傳送門

寫在前面:內心充滿波動

思路:

題目有幾個關鍵點:

1.每乙個點都必須有人經過

2.經過j點時,0~j-1必須都經過了才可以 由此可以構造出乙個網路流的模型。 由於每個節點的第一次訪問,必定是由小於它的節點完成的,所以先用floyd預處理dis[k][i][j]表示i到j只經過小於等於k的點的最短路。建圖如下

1.s->0 cap=k cost=0

2.i->t cap=1 cost=0

3.s->i+n cap=1 cost=0

4.i+n->j cap=inf cost=dis[j][i][j] 1是用來限制人數的,2則保證每個點經過一次,由於第一次經過該點時流向了t消耗了流量,所以每個點給予補充流量,即建圖3。4則是從乙個剛剛第一次經過的點繼續訪問其它點。這樣建圖可以發現,每個點的第一次訪問都被轉化成了一條從s出發的流且沒有交叉,這樣可以任意調整訪問順序,保證了j訪問之前0~j-1都已經訪問過

注意:

1.可能有重邊,記得判斷

2.「思路」中的i∈

[1,n

] **:

#include

#define inf 0x7ffff

using

namespace

std;

int s,t,tot=1,n,m,k,ans;

int first[4000],up[4000],dis[4000],maps[700][700];

bool vis[4000];

queue

q;struct edge

e[200000];

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

bool spfa()

}return dis[t]void flow()

main()

}while (spfa())

flow();

printf("%d",ans);

}

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城市,它可以繼續...

2324 ZJOI2011 營救皮卡丘

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

ZJOI2011 營救皮卡丘

題面 神仙題。做最小路徑覆蓋。有乙個很像的地方,就是最小路徑覆蓋必須覆蓋到每個點,這道題也一樣。這道題有4個和最小路徑覆蓋不一樣的地方 可以重複訪問 這個可以用 floyed 傳遞閉包解決 每條路徑必須從原點出發 每個點必須被 到達 並不能乙個節點成乙個路徑 假設已經訪問了 1.x 那麼至少有乙個人...