ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HIT暑期集训 网络流建图

2020-08-24 20:01:11  阅读:271  来源: 互联网

标签:HIT LibreOJ re int 暑期 dep lst num 流建图


A    LibreOJ 2979

D    LibreOJ 6014

E    LibreOJ 6015

F    LibreOJ 2031

G    LibreOJ 6226

题解参考:https://www.cnblogs.com/mrclr/p/9694664.html

#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#define maxn 40005
#define maxm 800005
using namespace std; 
const int inf=1<<30;
int a[8][2]={{-2,-1},{-2,1},{-1,2},{-1,-2},{2,-1},{2,1},{1,2},{1,-2}};
int mp[205][205];
int num,lst[maxn],cur[maxn],dep[maxn];
int s,t,n,m;
queue<int>q;
struct in
{
    int to,nxt,re;
}e[maxm];
void add(int x,int y,int z)
{
    e[++num].to=y;e[num].nxt=lst[x];lst[x]=num;e[num].re=z;
    e[++num].to=x;e[num].nxt=lst[y];lst[y]=num;e[num].re=0;
}
void clear()
{
    num=-1;
    memset(lst,-1,sizeof(lst));
}
int bfs()
{
    int i,u,v;
    while (!q.empty()) q.pop(); 
    memset(dep,-1,sizeof(dep));
    dep[s]=0;
    q.push(s);
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        for(i=lst[u];i!=-1;i=e[i].nxt)
        {
            v=e[i].to;
            if (e[i].re && dep[v]==-1)
            {
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }
    return dep[t]!=-1;
}
int dfs(int u,int flow) 
{
    if (u==t || !flow) return flow;
    int i,v,res,used=0;
    for (i=cur[u];i!=-1;i=e[i].nxt)
    {
        v=e[i].to;
        cur[u]=i;
        if (dep[v]==dep[u]+1 && e[i].re)
        {
            res=dfs(v,min(flow,e[i].re));
            if (res)
            {
                used+=res;
                flow-=res;
                e[i].re-=res;
                e[i^1].re+=res;
                if (!flow) return used; 
            } 
        }
    }
    if (flow) dep[u]=-1;
    return used;
}
int dinic()
{
    int i,maxflow=0;
    while (bfs())
    {
        for (i=0;i<=t;i++) cur[i]=lst[i];
        maxflow+=dfs(s,inf);
    }
    return maxflow;
}
int main()
{
    int x,y,i,j,k;
    clear();
    memset(mp,0,sizeof(mp));
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        mp[x][y]=1;
    }
    s=0;t=n*n+1;
    for (i=1;i<=n;i++)
    for (j=1;j<=n;j++)
    {
        if (mp[i][j]) continue; 
        //printf("ij %d %d\n",i,j);
        if ((i+j)&1)
        {
            add(s,(i-1)*n+j,1); 
            for (k=0;k<8;k++)
            {
                x=i+a[k][0];
                y=j+a[k][1];
                //printf("xy %d %d %d %d %d\n",x,y,k,a[k][0],a[k][1]);
                if (x<1 || y<1 || x>n || y>n || mp[x][y]) continue;
                add((i-1)*n+j,(x-1)*n+y,inf);
            }
        }
        else add((i-1)*n+j,t,1);
    }
    printf("%d\n",n*n-m-dinic());
    return 0;
}
View Code

H    LibreOJ 6227

I    LibreOJ 6033

J    LibreOJ 2096

标签:HIT,LibreOJ,re,int,暑期,dep,lst,num,流建图
来源: https://www.cnblogs.com/lsykk/p/13555946.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有