BZOJ-3175: [Tjoi2013]攻击装置(flood fill+最大流)

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

很经典的一道骑士共存问题,直接Flood fill之后网络流即可。

代码:

#include 
#include 
#include 
 
using namespace std;
 
#define MAXN 210
#define inf 0x7fffffff
#define MAXV 50010
 
struct graph {
        
        struct edge {
               edge *next,*pair;
               int t,f;
               edge () {
                       next=pair=NULL;
               }
        } *head[MAXV];
        
        int h[MAXV],gap[MAXV],S,T;
        edge *d[MAXV];
        
        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 sap(int v,int flow) {
               if (v==T) return flow;
               int rec=0;
               for (edge *p=d[v];p;p=p->next) if (h[v]==h[p->t]+1&&p->f) {
                       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() {
               memset(h,0,sizeof(h));
               memset(gap,0,sizeof(gap));
               gap[S]=T;
               for (int i=0;i++0&&X<=n&&Y>0&&Y<=n) {
                       if (!map[X][Y]) {
                               if (flag) g.AddEdge(v[x][y],v[X][Y],1);
                               if (f[X][Y])dfs(X,Y,flag^true);
                       }
               }
        }
}
 
void Init() {
        scanf("%d",&n);
        for (int i=0;i++

你可能感兴趣的:(BZOJ-3175: [Tjoi2013]攻击装置(flood fill+最大流))