題意:有m個人,給定n個城市構成dag。
每個城市恰好有vi個人經過,每條邊有費用。
每個人自選起點,終點。
求最小費用。
解:首先拆點,連邊,流量為[vi, vi]。
然後做有上下界有源匯最小費用可行流即可。
1 #include 2 #include 3 #include 4 #include 5 #include 6ac**7const
int n = 18000, m = 1000010, inf = 0x3f3f3f3f;8
9struct
edge edge[m << 1]; int top = 1;12
13int
e[n], d[n], vis[n], pre[n], flow[n];
14 std::queueq;
15bool vp[200010
];16
17 inline void add(int x, int y, int z, int
w) 33
34 inline bool spfa(int s, int
t) 54}55
}56}57
return d[t]
5960 inline void update(int s, int
t) 68
return;69
}7071 inline int solve(int s, int t, int &cost)
79return
ans;80}
8182
83int
main()
94for(int i = 1, x; i <= n; i++)
100 add(i +n, j, inf, x);
101}
102 add(ss, i, inf, 0
);103 add(i + n, t, inf, 0
);104
}105 add(s, ss, m, 0
);106 add(t, s, inf, 0
);107
intans;
108solve(s, t, ans);
109 printf("%d"
, ans);
110return0;
111 }
P4553 80人環遊世界 上下界可行費用流
link 無特殊說明費用都是0 新建源點s ss和匯點t tt,新建虛擬限制節點xun ixuni xuni s ss連向xun ixuni xuni 流量 0,m 0,m 0,m 的邊,表示可以派出的人不能超過mmm x un ixuni xuni 連向每個點流量 0,inf 0,inf 0,in...
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...