2324 ZJOI2011 營救皮卡丘

2021-08-07 06:33:25 字數 1413 閱讀 7906

題目鏈結

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

題解:每個點必須經過,且每個點一定從編號較小的點轉移而來->dag最小路徑覆蓋

乙個人當前在x點,他想要去y點,走過的最短路徑不能經過大於y的點用f

loyd

預處理一

個d[i

][j]

,表示滿

足上述條

件的i到

j的最短

路,這裡

不需要3

維陣列,

判斷一下

就可以了

除了0和n,每個點拆成入點和出點,0只有出點,n只有入點連(

st,0

,k,0

),控制

流量 連

(st,

i,1,

0),保

證每個點

經過一次

連(i,j+n

,1,d

[i][

j]),

j>i,

可行流

連(i+

n,ed

,1,0

),圖中

無匯,讓

最大流的

方案都對

應一種可

行的方案

判重邊……

我的收穫:花式轉dag

#include 

#include

#include

#include

#include

using

namespace

std;

const

int m=305;

#define inf 0x3f3f3f3f

int n,m,k,t,st,ed,ans;

int head[m],d[m],pre[m];

int w[m][m];

bool vis[m];

queue

q;struct edgee[100005];

void add(int u,int v,int c,int val);head[u]=t++;}

void insert(int i,int j,int w,int z)

bool spfa()}}

}return d[ed]!=inf;

}void flow()

}void floyd()

void build()

void work()

floyd();build();

}int main()

bzoj2324 ZJOI2011 營救皮卡丘

description 皮卡丘被火箭隊用 的計謀搶走了!這三個壞傢伙還給小智留下了赤果果的挑釁!為了皮卡丘,也為了正義,小智和他的朋友們義不容辭的踏上了營救皮卡丘的道路。火箭隊一共有n個據點,據點之間存在m條雙向道路。據點分別從1到n標號。小智一行k人從真新鎮出發,營救被困在n號據點的皮卡丘。為了方...

ZJOI2011 營救皮卡丘

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

ZJOI2011 營救皮卡丘

似乎這玩意兒叫做 k 路徑覆蓋問題 可以發現 k 個人每個人走過的點集不相交 就是有 n 個點 m 條邊的圖,邊有邊權,從 0 出發,中途如果經過點 u 那麼之前必須經過點 u 1 可以從點 s 出發最多 k 次,問走到 n 的最小花費 那麼題目就轉化成了用不超過 k 條不相交的鏈覆蓋整張圖的最小代...