上下界最小費用流
限制點訪問量->拆點[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解決啦
//view codelove 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;
}
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...