zoukankan      html  css  js  c++  java
  • BZOJ 1412 狼和羊的故事

    这个妥妥的最小割,但是我想了好久。。。。

    考虑所有羊连源点,狼连汇点,相邻点两边跑最小割(最大流)即可。

    正确性?考虑类似一个二分图的东西,我们只需要把狼集合和羊集合拦腰斩断即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define maxe 100005
    #define maxv 10011
    #define inf 1234567
    #define s 0
    #define t 10010
    using namespace std;
    int n,m,map[105][105],dx[]={0,0,1,0,-1},dy[]={0,1,0,-1,0};
    int dis[maxv],g[maxv],nume=1;
    struct edge
    {
    int v,f,nxt;
    }e[maxe];
    void addedge(int u,int v,int flow)
    {
    e[++nume].v=v;
    e[nume].nxt=g[u];
    e[nume].f=flow;
    g[u]=nume;
    e[++nume].v=u;
    e[nume].nxt=g[v];
    e[nume].f=0;
    g[v]=nume;
    }
    void build()
    {
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    {
    if (map[i][j]==1) addedge(s,(i-1)*m+j,inf);
    else if (map[i][j]==2) addedge((i-1)*m+j,t,inf);
    for (int k=1;k<=4;k++)
    {
    int tx=i+dx[k],ty=j+dy[k];
    if ((tx>=1) && (tx<=n) && (ty>=1) && (ty<=m))
    addedge((i-1)*m+j,(tx-1)*m+ty,1);
    }
    }
    }
    bool bfs()
    {
    memset(dis,-1,sizeof(dis));
    queue <int> q;
    q.push(s);
    dis[s]=0;
    while (!q.empty())
    {
    int head=q.front();
    q.pop();
    for (int i=g[head];i;i=e[i].nxt)
    {
    if ((e[i].f>0) && (dis[e[i].v]<0))
    {
    dis[e[i].v]=dis[head]+1;
    q.push(e[i].v);
    }
    }
    }
    if (dis[t]==-1) return false;
    return true;
    }
    int dinic(int x,int low)
    {
    if (x==t) return low;
    int ret=0;
    for (int i=g[x];low && i;i=e[i].nxt)
    {
    if ((e[i].f!=0) && (dis[e[i].v]==dis[x]+1))
    {
    int dd=dinic(e[i].v,min(low,e[i].f));
    low=low-dd;
    ret=ret+dd;
    e[i].f=e[i].f-dd;
    e[i^1].f=e[i^1].f+dd;
    }
    }
    if (ret==0) dis[x]=-1;
    return ret;
    }
    int main()
    {
    memset(map,0,sizeof(map));
    memset(g,0,sizeof(g));
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    scanf("%d",&map[i][j]);
    build();
    int ans=0;
    while (bfs()==true)
    ans=ans+dinic(s,inf);
    printf("%d ",ans);
    return 0;
    }

  • 相关阅读:
    postman: 字符串与数字的转换
    postman:截取字符串字符
    postman:获取txt变量中数据
    postman:参数化外部文件txt、csv、json
    postman:全局变量、环境变量、collection模块变量
    windows下更新python报错permission denied
    vertica 7.0 使用kafka
    Kafka报错-as it has seen zxid 0x83808 our last zxid is 0x0 client must try another server
    vertica 8.0 新特性
    mysql source导入报错ERROR 1366的解决方法
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5049877.html
Copyright © 2011-2022 走看看