• 【PowerOJ1753&网络流24题】分配问题(KM)


    题意:

     思路:费用流可做

    最好的算法是KM板子

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 typedef long long ll;
      4 typedef unsigned int uint;
      5 typedef unsigned long long ull;
      6 typedef long double ld;
      7 typedef pair<int,int> PII;
      8 typedef pair<ll,ll> Pll;
      9 typedef vector<int> VI;
     10 typedef vector<PII> VII;
     11 typedef pair<ll,ll>P;
     12 #define N  500
     13 #define M  1000000
     14 #define INF 1e9
     15 #define fi first
     16 #define se second
     17 #define MP make_pair
     18 #define pb push_back
     19 #define pi acos(-1)
     20 #define mem(a,b) memset(a,b,sizeof(a))
     21 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
     22 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
     23 #define lowbit(x) x&(-x)
     24 #define Rand (rand()*(1<<16)+rand())
     25 #define id(x) ((x)<=B?(x):m-n/(x)+1)
     26 #define ls p<<1
     27 #define rs p<<1|1
     28 
     29 const ll MOD=1e9+7,inv2=(MOD+1)/2;
     30       double eps=1e-6;
     31       int dx[4]={-1,1,0,0};
     32       int dy[4]={0,0,-1,1};
     33 
     34 int lx[N],ly[N],lk[N],slk[N],pre[N],vy[N],w[N][N],
     35     py,n,m,x,y,i,j,d,p;
     36 
     37 int read()
     38 {
     39    int v=0,f=1;
     40    char c=getchar();
     41    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     42    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     43    return v*f;
     44 }
     45 
     46 void solve1()
     47 {
     48     rep(i,1,n)
     49      rep(j,1,n) w[i][j]=-w[i][j];
     50     rep(i,1,n)
     51     {
     52         rep(j,1,n) slk[j]=INF,vy[j]=0;
     53         for(lk[py=0]=i;lk[py];py=p)
     54         {
     55             vy[py]=1; d=INF; x=lk[py];
     56             rep(y,1,n)
     57              if(!vy[y])
     58              {
     59                  if(lx[x]+ly[y]-w[x][y]<slk[y]) slk[y]=lx[x]+ly[y]-w[x][y],pre[y]=py;
     60                  if(slk[y]<d) d=slk[y],p=y;
     61              }
     62             rep(y,0,n)
     63              if(vy[y]) lx[lk[y]]-=d,ly[y]+=d;
     64               else slk[y]-=d;
     65 
     66         }
     67         for(;py;py=pre[py]) lk[py]=lk[pre[py]];
     68     }
     69     ll ans=0;
     70     rep(i,1,n) ans+=lx[i]+ly[i];
     71     printf("%lld
    ",-ans);
     72 }
     73 
     74 void solve2()
     75 {
     76     mem(lx,0);
     77     mem(ly,0);
     78     mem(lk,0);
     79     rep(i,1,n)
     80      rep(j,1,n) w[i][j]=-w[i][j];
     81     rep(i,1,n)
     82     {
     83         rep(j,1,n) slk[j]=INF,vy[j]=0;
     84         for(lk[py=0]=i;lk[py];py=p)
     85         {
     86             vy[py]=1; d=INF; x=lk[py];
     87             rep(y,1,n)
     88              if(!vy[y])
     89              {
     90                  if(lx[x]+ly[y]-w[x][y]<slk[y]) slk[y]=lx[x]+ly[y]-w[x][y],pre[y]=py;
     91                  if(slk[y]<d) d=slk[y],p=y;
     92              }
     93             rep(y,0,n)
     94              if(vy[y]) lx[lk[y]]-=d,ly[y]+=d;
     95               else slk[y]-=d;
     96 
     97         }
     98         for(;py;py=pre[py]) lk[py]=lk[pre[py]];
     99     }
    100     ll ans=0;
    101     rep(i,1,n) ans+=lx[i]+ly[i];
    102     printf("%lld
    ",ans);
    103 }
    104 
    105 
    106 int main()
    107 {
    108     //freopen("1.in","r",stdin);
    109     n=read();
    110     rep(i,1,n)
    111      rep(j,1,n) w[i][j]=read();
    112     solve1();
    113     solve2();
    114 }
  • 相关阅读:
    document.all用法
    $.ajax同步/异步(async:false/true)
    link 和@import 的区别
    如何对网页的加载进行性能优化
    border-style有哪些值?
    CSS设置DIV居中
    jquery选择器
    jQuery库中获取jQuery对象的方式
    Observer,观察者模式,C++描述
    Iterator,迭代器模式,C++描述
  • 原文地址:https://www.cnblogs.com/myx12345/p/11765338.html
Copyright © 2020-2023  润新知