Tranvick

Min. cost flow

Mar 6th, 2012
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:65777216")
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cstdlib>
  5. #include <ctime>
  6. #include <cstdio>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <vector>
  10. #include <set>
  11. #include <stack>
  12. #include <map>
  13. #include <queue>
  14. #include <string>
  15. #include <memory.h>
  16. #include <iterator>
  17. #define y1 trololoy1
  18. #define y0 trololoy0
  19. #define mem(A,X) memset(A,X,sizeof(A))
  20. #define memo(A) memset(A,0,sizeof(A))
  21. #define forn(I,B) for (int I=1;I<=(B);I++)
  22. #define forg(H,V) for (int H=first[V];h;h=next[H])
  23. #define rep(I,B) for (int I=0;I<(B);I++)
  24. #define labs(X) (((X)>0)?(X):(-(X)))
  25. #define ropen(X) freopen(X,"r",stdin)
  26. #define wopen(X) freopen(X,"w",stdout)
  27. #define rwopen(X) freopen(X".in","r",stdin);freopen(X".out","w",stdout)
  28. #define pb push_back
  29. #define mp make_pair
  30. #define all(X) (X).begin(),(X).end()
  31. #define sqr(X) ((X)*(X))
  32.  
  33. using namespace std;
  34.  
  35. typedef pair <int,int> pii;
  36. typedef double ld;
  37. typedef long long ll;
  38. typedef pair <ll,ll> pll;
  39. typedef vector<int> vi;
  40. const int N=222;
  41. const int M=55555;
  42. const int INF=111111111;
  43. const double eps=1e-9;
  44. const double pi=3.14159265358979;
  45.  
  46. int ef[M],es[M],first[N],next[M],ev[M],ec[M],S=220,T=221,a[N],b[N],x,y,z,c,n,sum1,sum2,ans,from[N],edge[N],d[N];
  47.  
  48. inline int be(int x){
  49.     return (x&1)?x+1:x-1;
  50. }
  51.  
  52. inline void add(int x,int y,int z,int co){
  53.     next[++c]=first[x];first[x]=c;
  54.     ef[c]=x;es[c]=y;ev[c]=z;ec[c]=co;
  55. }
  56.  
  57. void create_graph(){
  58.     forn(i,n){
  59.         add(S,i,a[i],0);
  60.         add(i,S,0,0);
  61.     }
  62.     forn(i,n) forn(j,n){
  63.         add(i,100+j,INF,labs(i-j)*z);
  64.         add(100+j,i,0,-labs(i-j)*z);
  65.         add(i,100+j,INF,x+y);
  66.         add(100+j,i,0,-x-y);
  67.     }
  68.     forn(i,n){
  69.         add(100+i,T,b[i],0);
  70.         add(T,100+i,0,0);
  71.     }
  72. }
  73.  
  74. inline bool find_path(){
  75.     mem(d,63);
  76.     d[S]=0;
  77.     forn(i,n+n+2) forn(j,c){
  78.         if (!ev[j]) continue;
  79.         if (d[es[j]]>d[ef[j]]+ec[j] && d[ef[j]]<1000000000){
  80.             d[es[j]]=d[ef[j]]+ec[j];
  81.             from[es[j]]=ef[j];
  82.             edge[es[j]]=j;
  83.         }
  84.     }
  85.     return d[T]<1000000000;
  86. }
  87.  
  88. int main(){
  89.     rwopen("landscape");
  90.     scanf("%d%d%d%d",&n,&x,&y,&z);
  91.     forn(i,n){
  92.         scanf("%d%d",&a[i],&b[i]);
  93.         sum1+=a[i];
  94.         sum2+=b[i];
  95.     }
  96.     if (sum1>sum2) ans=(sum1-sum2)*y;
  97.     else ans=(sum2-sum1)*x;
  98.     create_graph();
  99.     while (find_path()){
  100.         int q=INF;
  101.         for (int v=T;v!=S;v=from[v]) q=min(q,ev[edge[v]]);
  102.         ans+=q*d[T];
  103.         for (int v=T;v!=S;v=from[v]){
  104.             ev[edge[v]]-=q;
  105.             ev[be(edge[v])]+=q;
  106.         }
  107.     }
  108.     printf("%d\n",ans);
  109.     return 0;
  110. }
Advertisement
Add Comment
Please, Sign In to add comment