BZOJ2055 80人環遊世界

2022-05-25 11:00:17 字數 1294 閱讀 4880

上下界最小費用流

限制點訪問量->拆點[i,i']

建圖:1.s->s [m,m] 0

2.s->i [0,inf] 0 i'->t [0,inf] 0

3.i『-j [0,inf] x

4.i->i'[vi,vi] 0

然後就是上下界流的常見套路啦

根據「調整」原則 先是每個點點權為di=ini-outi 然後》0的連源點 <0的連匯點

然後迴圈流原始源點和匯點連邊 由於這個題每條限制邊都是卡緊的所以不需要再往回跑一次

接下來就是喜聞樂見的dinic解決啦

//

love and freedom.

#include#include

#include

#include

#include

#define inf 20021225

#define ll long long

#define m 100010

#define n 210

using

namespace

std;

struct edgee[m<<1

];int

in[n],cnt=1,s,t,ss,s,tt,from

[n];

void add(int x,int y,int f,int

c)queue

q; int dis[n]; bool

vis[n];

bool

spfa()

}vis[x]=0

; }

return dis[tt]!=dis[0];}

intflow()

int d[n],n,v[n]; int

ans;

intmain()

s=n<<1|1; s=s+1; t=s+1; ss=t+1; tt=ss+1;//

tt=ss+1;

d[s]-=m; d[s]+=m;

for(int i=1;i)

for(int j=i+1;j<=n;j++)

for(int i=1;i<=n;i++) add(s,i,inf,0),add(i+n,t,inf,0

);

for(int i=1;i<=s;i++)

add(t,s,inf,

0); while(spfa()) ans+=flow();

printf(

"%d\n

",ans);

return0;

}

view code

BZOJ2055 80人環遊世界

題解 總算a掉了,各種蛋疼。int main for1 i,n for2 j,i 1,n for1 i,n insert i n,t,0,inf,0 insert t,s,0,inf,0 mcf printf d n mincost return0 s是附加源,sss是真正的源,t是真正的匯。這樣構...

bzoj 2055 80人環遊世界

有源匯上下界最小費用可行流。將每個國家拆點。源點向乙個新建節點連一條上界為總人數下界為0費用為0的邊。新建節點向每個國家的入點連一條上界為正無窮下界為0費用為0的邊。每個國家的入點向出點連一條上下界均為該國家訪問人數費用為0的邊。每個國家的出點向匯點連一條上界為正無窮下界為0費用為0的邊。對於國家i...

bzoj2055 80人環遊世界(可行流)

傳送門 表示完全看不懂最小費用可行流 據某大佬說 我們考慮拆點,然後進行如下連邊 s 向 a i 連邊,權值 0 容量 0,m a i 向 a i 連邊,權值 0 容量 v i,v i 如果存在邊 i,j 則連邊 a i a i 權值為 w 容量 0,m a i 向 t 連邊,權值 0 容量 0,m...