zkw 费用流

#include <bits/stdc++.h>
using namespace std;
struct mis{
    int st,ed,wt;
}ms[1100];

//===========================NetworkCostFlowZkw========

struct par
{
  int a, b;
  par(int _a = 0, int _b = 0) : a(_a), b(_b) {}
};

const int NCFSmaxn = 2005; //最大节点数
const int NCFSmaxm = 2000005; //最大边数
const int NCFSinf_ = 0x7f; //最大权值的两位 如(0x7f)
const int NCFSinf  = 0x7f7f7f7f; //最大权值必为NCFSinf_的满状态 如(0x7f7f7f7f)

struct NCFS_Line
{
  int fr, to, next, v, c, opt;
};

struct Network_Cost_Flow_Spfa
{
  NCFS_Line li[NCFSmaxm];
  int be[NCFSmaxn], l, s, t, n, dist[NCFSmaxn], fa[NCFSmaxn], b[NCFSmaxn];
  deque<int> q;

  void makeline(int fr, int to, int v, int c)
  {
    ++l;
    li[l].next = be[fr];
    be[fr] = l;
    li[l].fr = fr;
    li[l].to = to;
    li[l].v = v;
    li[l].c = c;
    li[l].opt = l + 1;

    ++l;
    li[l].next = be[to];
    be[to] = l;
    li[l].fr = to;
    li[l].to = fr;
    li[l].v = 0;
    li[l].c = -c;
    li[l].opt = l - 1;
  }

  void create(int N)
  {
    n = N;
  }

  void clear()
  {
    l = s = t = n = 0;
    memset(be, 0, sizeof(be));
  }

  bool spfa()
  {
    memset(dist, NCFSinf_, sizeof(dist));
    memset(fa, 0, sizeof(fa));
    dist[t] = 0;
    b[t] = 1;
    q.push_back(t);
    while (!q.empty())
    {
      int now = q.front();
      q.pop_front();
      for (int i = be[now]; i; i = li[i].next)
      {
        int to = li[i].to;
        if (!li[li[i].opt].v || dist[to] <= dist[now] - li[i].c) continue;
        dist[to] = dist[now] - li[i].c;
        fa[to] = i;
        if (!b[to])
        {
          b[to] = 1;
          if (!q.empty() && dist[to] < dist[q.front()]) q.push_front(to);
          else q.push_back(to);
        }
      }
      b[now] = 0;
    }
    return dist[s] != NCFSinf;
  }
  par query(int S, int T)
  {
    par ans;
    ans.a = ans.b = 0;
    s = S, t = T;
    int kase = 3;
    while (--kase && spfa())
    {
      int mi = NCFSinf;
      for (int i = s; i != t; i = li[fa[i]].fr)
        mi = min(mi, li[li[fa[i]].opt].v);
      for (int i = s; i != t; i = li[fa[i]].fr)
      {
        li[fa[i]].v += mi;
        li[li[fa[i]].opt].v -= mi;
        ans.b -= mi * li[fa[i]].c;
      }
      ans.a += mi;
    }
    return ans;
  }
} ac;

//===========================NetworkCostFlowZkw========
int main()
{
    int n,s,i,j,st,ed; 
    while(scanf("%d",&n) && n)
    { 
        ac.clear();
        s = 0;
        st = 2*n+1;
        ed = 2*n+2;
        for(i = 1;i <= n;i++)
            scanf("%d%d%d",&ms[i].st,&ms[i].ed,&ms[i].wt);  
        for(i = 1;i <= n;i++)
            for(j = 1;j <= n;j++)
                if(ms[i].ed < ms[j].st)
                    ac.makeline(i+n,j,1,0);
        ac.makeline(s,st,2,0);
        for(i = 1;i <= n;i++)
        {
            ac.makeline(i,i+n,1,-ms[i].wt);
            ac.makeline(st,i,1,0);
            ac.makeline(i+n,ed,1,0);
        }
        printf("%d\n",-ac.query(s,ed).b); 
    }
}

results matching ""

    No results matching ""