zoukankan      html  css  js  c++  java
  • 蜥蜴-DInic

    题目背景

    07四川省选

    题目描述

    在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外。

    每行每列中相邻石柱的距离为1,蜥蜴的跳跃距离是d,即蜥蜴可以跳到平面距离不超过d的任何一个石柱上。石柱都不稳定,每次当蜥蜴跳跃时,所离开的石柱高度减1(如果仍然落在地图内部,则到达的石柱高度不变),如果该石柱原来高度为1,则蜥蜴离开后消失。以后其他蜥蜴不能落脚。任何时刻不能有两只蜥蜴在同一个石柱上。

    输入输出格式

    输入格式:

    输入第一行为三个整数r,c,d,即地图的规模与最大跳跃距离。以下r行为石竹的初始状态,0表示没有石柱,1~3表示石柱的初始高度。以下r行为蜥蜴位置,“L”表示蜥蜴,“.”表示没有蜥蜴。

    输出格式:

    输出仅一行,包含一个整数,即无法逃离的蜥蜴总数的最小值。

    输入输出样例

    输入样例#1:
    5 8 2
    00000000
    02000000
    00321100
    02000000
    00000000
    ........
    ........
    ..LLLL..
    ........
    ........
    
    输出样例#1:
    1

    说明

    100%的数据满足:1<=r, c<=20, 1<=d<=3

    写代码时犯了三个错误

      *注意柱子间建边条件。满足条件:不在同一列 或 不在同一行 不是既 在同一列 或 不在同一行。

      *读入的是字符。

      *出图条件。

      *数组大小。至多有400个点。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<math.h>
    using namespace std;
    #define M 99893535
    int     c,r,d,dd,s,t,tot,na[100][100],ans,m1[100][100],dep[9200],map[1010][1010];
    char m2[400][400];
    int dfs(int u,int t,int f)
    {
        if(u==t)    return f;
        int d;
        for(int v=1;v<=tot;v++)
        if(map[u][v]>0&&dep[v]==dep[u]+1&&(d=dfs(v,t,min(f,map[u][v]))))
        {            
            map[u][v]-=d;
            map[v][u]+=d;
            return d;    
        }
        return 0;
    }
    int bfs(int s=1,int t=2)
    {
        queue<int>q;q.push(s);
        memset(dep,-1,sizeof(dep));
        dep[s]=0;
        while(!q.empty()){
            int u=q.front();q.pop();
            for(int v=1;v<=tot;v++)
            if(map[u][v]>0&&dep[v]==-1)
            {
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
        return dep[t]!=-1;
    }
    int dinic()
    {
        int flow=0,f=0;
        while(bfs(1,2))
            while(1){
            f=dfs(1,2,M);
            if(!f)    break;
            flow+=f;
            }
        return flow;
    }
    void find(int x,int y) 
    {
        int now=na[x][y]+1;
        for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)
            if( (i!=x||j!=y) &&m1[i][j]>0)    
                if(d*d>=  ((x-i)*(x-i)+(y-j)*(y-j))  ) 
                    map[now][ na[i][j] ]=M;
    }
    int main()
    {
        s=1,t=2,tot=2;
        scanf("%d%d%d",&r,&c,&d);    
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
            {
                char oo; 
                cin>>oo;
                m1[i][j]=oo-'0';
                if(m1[i][j])
                {
                    int w=na[i][j]=++tot;tot++;
                    map[w][w+1]=m1[i][j];
                    
                }
            }
        char o;
        for(int i=1;i<=r;i++)
            for(int j=1;j<=c;j++)
            {
                cin>>o;    m2[i][j]=o;
                if(o=='L')
                {
                    int w=na[i][j];
                    map[s][w]=1;
                    ans++;            
                }
            }
        for(int i=1;i<=r;i++)
        for(int j=1;j<=c;j++)    
        if(m1[i][j])
        {
            find(i,j);
            if(i<=d||j<=d||(r-i+1)<=d||(c-j+1)<=d)    
            map[ na[i][j]+1 ][t]=M ;
        }    
        printf("%d",ans-dinic());    
        return 0;
    } 
  • 相关阅读:
    排序入门练习题3 谁考了第k名 题解
    排序入门练习题2 从大到小排序 题解
    排序入门练习题1 排序 题解
    关于这个博客
    Count Good Substrings
    Long Long Message
    Milk Patterns
    Musical Theme
    Life Forms
    New Distinct Substrings
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/6781763.html
Copyright © 2011-2022 走看看