AHOI2014 支線劇情 有上下界的網路流

2022-03-29 03:37:43 字數 1491 閱讀 3988

jyy現在所玩的rpg遊戲中,一共有n個劇情點,由1到n編號,第i個劇情點可以根據jyy的不同的選擇,而經過不同的支線劇情,前往ki種不同的新的劇情點。當然如果為0,則說明i號劇情點是遊戲的乙個結局了。

jyy**乙個支線劇情需要一定的時間。jyy一開始處在1號劇情點,也就是遊戲的開始。顯然任何乙個劇情點都是從1號劇情點可達的。此外,隨著遊戲的進行,劇情是不可逆的。所以遊戲保證從任意劇情點出發,都不能再回到這個劇情點。由於jyy過度使用修改器,導致遊戲的「存檔」和「讀檔」功能損壞了,

所以jyy要想回到之前的劇情點,唯一的方法就是退出當前遊戲,並開始新的遊戲,也就是回到1號劇情點。jyy可以在任何時刻退出遊戲並重新開始。不斷開始新的遊戲重複**已經看過的劇情是很痛苦,jyy希望花費最少的時間,看完所有不同的支線劇情。

\(n \leq 300\)

看完所有劇情,就是要求每條邊至少經過一次。又因為時間可以疊加計算,容易想到有上下界的費用流。源點連向1號節點,出度為0的點連向匯點,流量上下界為\([0,\infin)\).原圖上的邊上下界為\([1,\infin)\)即可。

有上下界的網路流見網路流常見建圖套路總結

#include#include#include#include#define maxn 100000 

#define maxm 500000

#define inf 0x3f3f3f3f3f3f3f3f

using namespace std;

typedef long long ll;

namespace mcmfe[maxm*2+5];

int head[maxn+5];

int esz=1;

void add_edge(int u,int v,ll w,ll c)

ll dist[maxn+5],minf[maxn+5],last[maxn+5];

bool inq[maxn+5];

bool spfa(int s,int t)}}

}}

if(dist[t]==inf) return 0;

else return 1;

}void update(int s,int t)

}ll mcmf(int s,int t)

return ct;

}} namespace exmcmfe[maxm+5];

int cnte=0,cntv=0;

void adde(int u,int v,ll l,ll r,ll c)

ll dflow[maxn+5];

ll solve(int s,int t)

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

return ans+mcmf::mcmf(ss,tt);

}}int n;

int main()

exmcmf::adde(i,t,0,inf,0);

}printf("%lld\n",exmcmf::solve(s,t));

}

AHOI2014 支線劇情(有上下界的網路流)

題目要求即為每條邊至少經過一次,那麼就想到有下界網路流 上界為正無窮 每條邊的流量就代表經過了幾次。建立乙個源點和匯點,從源點連向 1 一條下界為 0 的邊,從每個點連向匯點一條下界為 0 的邊,應為還要求時間最短所以是上下界最小費用流。套模板即可。includeusing namespace st...

AHOI2014 JSOI2014 支線劇情

傳送門 上下界網路流。以 1 號節點為源點 s 新建乙個匯點 t 如果 u 能到 v 那麼連邊 u to v 下界為 1 上界為 infty 費用為對應的所需時間,表示這段劇情至少看一次,且看一次代價為對應的所需時間。又因為我們可以在任何乙個節點重開一次,所以我們的每個節點 u 都連邊 u to t...

AHOI2014 JSOI2014 支線劇情

嘟嘟嘟 這是一道上下界費用流的模板題。源點就是1,匯點沒有,所以我們把每乙個點都連向匯點,因為可以在任意乙個點退出遊戲。上下界費用流的建圖方法和上下界網路流的建圖方法一樣。都是建立附加源匯。只不過每條邊多了個費用。有費用的邊就是他自己的費用,其他的 比如補償用的邊 的費用全是0。然後我們跑費用流,答...