題目鏈結
題目大意: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 條不相交的鏈覆蓋整張圖的最小代...