传送门
- 第一次自己玩对偶,少考虑了一个限制调了一万年,馹,不过还蛮兴奋的
 
- 这显然是个全幺模矩阵,也就是说最优解可以在整数取得,注意到对偶后不需要初始化
 - 设对偶后的变量为
,则有
 
#include<bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
cs int N = 1e3 + 50;
typedef long long ll;
int n, m; ll dg[N];
namespace LP{
  cs double eps = 1e-10, INF = 1e17;
  double a[N][N]; int n, m;
  int id[N];
  void pivot(int l, int e){
    double t=a[l][e]; a[l][e]=1;
    swap(id[l+n],id[e]);
    for(int i=0; i<=m; i++) a[l][i]/=t;
    for(int i=0; i<=n; i++) if(l!=i&&fabs(a[i][e])>0){
      t=a[i][e]; a[i][e]=0;
      for(int j=0; j<=m; j++) a[i][j]-=t*a[l][j];
    }
  }
  int simplex(){
    while(true){
      int l=0, e=0; double mn=INF;
      for(int i=1; i<=m; i++) if(a[0][i]>eps){ e=i; break; }
      if(!e) break; 
      for(int i=1; i<=n; i++) if(a[i][e]>eps&&a[i][0]/a[i][e]<mn) 
      mn=a[i][0]/a[i][e], l=i; if(!l) return -1; //unbounded 
      pivot(l,e);
    } return (ll)-a[0][0];
  }
} using LP::a;
int main(){
  #ifdef FSYolanda
  freopen("1.in","r",stdin);
  #endif
  scanf("%d%d",&n,&m);
  for(int i=1,u,v,c,f; i<=m; i++){
    scanf("%d%d%d%d",&u,&v,&c,&f);
    a[0][i+m+n+n]=-f;
    a[0][i]=f-c; dg[u]+=f; dg[v]-=f;
    ++LP::m; a[LP::m][0]=1; a[LP::m][i]=-1;
    if(v<n) a[LP::m][v+m]=1, a[LP::m][v+m+n]=-1;
    if(u>1) a[LP::m][u+m]=-1, a[LP::m][u+m+n]=1;
    ++LP::m; a[LP::m][0]=1; a[LP::m][i]=1; a[LP::m][i+m+n+n]=-1;
    if(v<n) a[LP::m][v+m]=-1, a[LP::m][v+m+n]=1;
    if(u>1) a[LP::m][u+m]=1, a[LP::m][u+m+n]=-1;
  } for(int i=1; i<=m; i++) ++LP::m, a[LP::m][0]=1, a[LP::m][i]=1;
  for(int i=2; i<n; i++) a[0][i+m]=dg[i], a[0][i+m+n]=-dg[i];
  LP::n = m+m+n+n; swap(LP::n, LP::m);
  cout<<LP::simplex(); return 0;
}                
                










