BZOJ-1066: [SCOI2007]蜥蜴(最大流)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1066

裸的最大流,拆点,按关系建图,然后跑一次maxflow就可以了。

代码:

eaf81a4c510fd9f94edfd36e272dd42a2934a4e9.jpg.png
#include 
#include 
#include 
#include 
 
using namespace std;
 
#define MAXN 25
#define inf 0x7fffffff
#define MAXV 2010
 
struct graph {
        struct edge {
               int t,f;
               edge *next,*pair;
               edge () {
                       next=pair=NULL;
               }
        } *head[MAXV];
        int S,T;
        
        graph () {
               memset(head,0,sizeof(head));
        }
        
        void Add(int s,int t,int f) {
               edge *p=new(edge);
                p->t=t,p->f=f,p->next=head[s];
               head[s]=p;
        }
        void AddEdge(int s,int t,int f) {
               Add(s,t,f),Add(t,s,0);
               head[s]->pair=head[t],head[t]->pair=head[s];
        }
        
        int h[MAXV],gap[MAXV];
        edge *d[MAXV];
        
        int sap(int v,int flow) {
               if (v==T) return flow;
               int rec=0;
               for (edge *p=d[v];p;p=p->next) if (p->f&&h[v]==h[p->t]+1) {
                       int ret=sap(p->t,min(flow-rec,p->f));
                       p->f-=ret,p->pair->f+=ret,d[v]=p;
                       if ((rec+=ret)==flow) return flow;
               }
               if (!(--gap[h[v]])) h[S]=T;
               gap[++h[v]]++,d[v]=head[v];
               return rec;
        }
        
        int maxflow() {
               int flow=0;
               memset(h,0,sizeof(h)),memset(gap,0,sizeof(gap));
               gap[0]=T;
               for (int i=0;i++=sqrt((i-I)*(i-I)+(j-J)*(j-J))) g.AddEdge(node[i][j][1],node[I][J][0],inf);
               }
        }
        for (int i=0;i++

你可能感兴趣的:(BZOJ-1066: [SCOI2007]蜥蜴(最大流))