bzoj1066

首先,我们可以想到从源点向每个有蜥蜴的地方连边,然后拆点,因为我们不能把一个点连向多条边,这样修改边的时候不可以,所以拆个点,就可以了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
struct edge
{
    int to,nxt,f;
}e[3011];
string s;
int r,c,d,ans,cnt=1,tot;
int board[1010][1010];
int g[3011],dist[3011];
void link(int u,int v,int f)
{
    e[++cnt].nxt=g[u];
    g[u]=cnt;
    e[cnt].f=f;
    e[cnt].to=v;
}
inline int Min(int x,int y)
{
    return x<y?x:y;
}
inline int abs(int x)
{
    return x<0?-x:x;
}
inline int Max(int x,int y)
{
    return x>y?x:y;
}
inline void ins(int u,int v,int f)
{
    link(u,v,f); link(v,u,0);
}
bool bfs()
{
    queue<int>q;
    memset(dist,inf,sizeof(dist));
    dist[0]=0;
    q.push(0);
    while(!q.empty())
    {
        int u=q.front(); q.pop();
        for(int i=g[u];i;i=e[i].nxt)
        {
            int v=e[i].to;
            if(e[i].f&&dist[v]==inf)
            {
                dist[v]=dist[u]+1;
                q.push(v);
            }
        }
    }
    return dist[1010]!=inf;
}
int dfs(int u,int delta)
{
    if(u==1010) return delta;
    int ret=0;
    for(int i=g[u];i&&delta;i=e[i].nxt)
    {
        int v=e[i].to;
        if(e[i].f&&dist[v]==dist[u]+1)
        {
            int dd=dfs(v,Min(e[i].f,delta));
            delta-=dd;
            e[i].f-=dd;
            e[i^1].f+=dd;
            ret+=dd;
        }
    }
    return ret;
}
inline void dinic()
{
    while(bfs())
    {
        ans+=dfs(0,inf);
    }
    printf("%d",tot-ans);
}
int main()
{
    cin>>r>>c>>d;
    for(int i=1;i<=r;i++)
    {
        cin>>s;
        for(int j=0;j<s.length();j++)
        {
            board[i][j+1]=s[j]-‘0‘;
        }
    }
    for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++) if(board[i][j])
        {
            ins((i-1)*c+j,(i-1)*c+j+r*c,board[i][j]);
            if(j-d<=0||j+d>c||i-d<=0||i+d>r)
            {
                ins((i-1)*c+j+r*c,1010,board[i][j]);
            }
            for(int a=Max(1,i-d);a<=Min(i+d,r);a++)
                for(int b=Max(1,j-d);b<=Min(j+d,c);b++)
                    if(abs(a-i)+abs(b-j)<=d&&board[a][b])
                        ins((i-1)*c+j+r*c,(a-1)*c+b,inf);
        }
    for(int i=1;i<=r;i++)
    {
        cin>>s;
        for(int j=0;j<s.length();j++)
        {
            if(s[j]==‘L‘) {tot++; ins(0,(i-1)*c+j+1,1);}
        }
    }
    dinic();
    return 0;
}
时间: 2024-10-10 20:03:10

bzoj1066的相关文章

【bzoj1066】: [SCOI2007]蜥蜴 图论-最大流

[bzoj1066]: [SCOI2007]蜥蜴 把石柱拆点,流量为高度 然后S与蜥蜴连流量1的边 互相能跳到的石柱连inf的边 石柱能到边界外的和T连inf的边 然后跑dinic就好了 1 /* http://www.cnblogs.com/karl07/ */ 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <al

bzoj1066[SCOI2007]蜥蜴

bzoj1066[SCOI2007]蜥蜴 题意: r行c列网格图上有一些高低不平的柱子,一些柱子上有蜥蜴,一只蜥蜴一次能跳距离为d,每次蜥蜴跳跃时出发柱子高度减一,当柱子高度为0时消失,问最少多少蜥蜴不能跳出网格图.r,c≤20,d≤4 题解: 裸最大流,每个柱子拆成X,Y两点,两点之间连柱子的高度,所有Yi向可达柱子的Xi连边,s向所有蜥蜴初始位置连边,所有可以跳出图的柱子向t连边. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #

【bzoj1066】[SCOI2007]蜥蜴 网络最大流

[bzoj1066][SCOI2007]蜥蜴 Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上.石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失.以后其他蜥蜴不能落脚.任何时刻不能有两只蜥蜴在同一个石柱上. Input 输入第

[BZOJ1066][luogu_P2472][SCOI2007]蜥蜴

[BZOJ1066][luogu_P2472][SCOI2007]蜥蜴 试题描述 在一个 \(r\) 行 \(c\) 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为 \(1\),蜥蜴的跳跃距离是 \(d\),即蜥蜴可以跳到平面距离不超过 \(d\) 的任何一个石柱上.石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减 \(1\)(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为 \(1\),则蜥蜴离开

bzoj1066:最大流

happying...终于能自己想出一道题了,题目的意思就是说求最多能有多少只蜥蜴能够逃离,看到了节点容量,就试着画一下,将有用的石柱作为节点,并拆点,(可看成每个节点都有一个允许通过的最大流量),然后有蜥蜴的节点和S相连,c=1,相互之间能到达的相连,c=inf,能够出了边界的节点和t相连,c=inf,求最大流就可以了.感觉处理起来有点麻烦,明天再写.

bzoj1066 蜥蜴

Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上.石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失.以后其他蜥蜴不能落脚.任何时刻不能有两只蜥蜴在同一个石柱上. Input 输入第一行为三个整数r,c,d,即地图的规模与最大跳

bzoj1066【SCOI2007】蜥蜴

1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2512  Solved: 1238 [Submit][Status][Discuss] Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上.石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱

[BZOJ1066] [SCOI2007] 蜥蜴 (网络流)

Description 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上.石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失.以后其他蜥蜴不能落脚.任何时刻不能有两只蜥蜴在同一个石柱上. Input 输入第一行为三个整数r,c,d,即地图的规模与最大跳

BZOJ1066 网络流

拆点,将一个柱子拆成入点和出点,入点出点之间的容量就是柱子的容量    1066: [SCOI2007]蜥蜴 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃 到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石 柱上.石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不 变),如果该石柱原来高度为1,则蜥蜴离开后消失.以后其他蜥蜴不能落脚.任何时刻不能