CodeVS2133星際競速

2021-07-26 04:14:26 字數 1047 閱讀 3176

為何sdoi的題總是讓人感覺如此舒爽!

言歸正傳,這道題的確讓我獲益匪淺。把每個點拆成兩個,假如是xi和yi,設能力爆發的費用是bi,任意邊為(u,v,w),那麼連邊:(s,xi,1,0)(s,yi,1,bi)(xu,yv,1,w)最後跑一遍最小費用最大流即可。

解釋:題目規定,每個點只能訪問一次,那麼yi的作用就是這個,乙個點i被訪問的充要條件是由乙個大小為1的流流經yi並流進了t。那麼乙個點被訪問有兩種方式:一種是能力爆發,即邊(s,yi,1,bi);另一種是通過邊來訪問,即邊(xu,yv,1,w),這裡的c=1是沒必要的,只是為了統一。其實最開始的想法應該是把所有的邊建在左邊然後連向對應的終點,但是為了節省節點數,就在左邊拆了一排xi這樣的點,這道題的拆點和平常所說的拆點限流沒有絲毫關係。

//費用流

#include #include #include #define maxn 1000000

#define inf 0x3f3f3f3f

using namespace std;

int n, m, d[maxn], in[maxn], head[maxn], next[maxn], c[maxn], w[maxn], to[maxn], s, t, pre[maxn],

cost, tot=1;

queueq;

void adde(int a, int b, int cc, int ww)

void adde2(int a, int b, int cc, int ww)

bool spfa()

} return d[t]!=inf;

}int augment()

void build()

{ int i, x, y, z;

scanf("%d%d",&n,&m);

s=n*2+1, t=s+1;

for(i=1;i<=n;i++)scanf("%d",&x),adde2(s,n+i,1,x),adde2(s,i,1,0),adde2(n+i,t,1,0);

for(i=1;i<=m;i++)scanf("%d%d%d",&x,&y,&z),adde2(x

SDOI2010 星際競速

10年一度的銀河系賽車大賽又要開始了。作為全銀河最盛大的活動之一,奪得這個專案的冠軍無疑是很多人的夢想,來自傑森座 星的悠悠也是其中之一。賽車大賽的賽場由n顆行星和m條雙向星際航路構成,其中每顆行星都有乙個不同的引力值。大賽要求車手們從一顆與這n顆行星之間沒有任何航路的天體出發,訪問這n顆行星每顆恰...

BZOJ1927星際競速

1927 sdoi2010 星際競速 time limit 20 sec memory limit 259 mb submit 1727 solved 1053 description 10 年一度的銀河系賽車大賽又要開始了。作為全銀河最盛大的活動之一,奪得這個專案的冠軍無疑是很多人的夢想,來自傑森...

SDOI2010 星際競速

昨天連續做了兩道網路流 這是第一道 這是道圖論題是肯定的,圖都給你了 那麼問題在於如何建模 問題要求訪問每個點恰好一次 我一開始沒看到這個條件 要求總時間最短,嘗試把問題轉化為一些經典圖論問題比如最短路 很可惜不行,那麼自然想到網路流 組裡面有句戲言叫 一切皆可網路流 比如a b 進一步分析發現單純...