HDU5093【最大流】

题意:在*上建设炮塔,炮塔会像上下左右4个方向发射炮弹。o为浮冰,炮弹会越过。#为冰山,会阻挡炮弹。建设的炮塔会相互攻击,问最多建设多少个不互相攻击的炮塔。

本来我以为是贪心的,就像http://acm.hdu.edu.cn/showproblem.php?pid=1045一样,结果WA了,不懂是写错还是非法不行。

后来改成用http://acm.hdu.edu.cn/showproblem.php?pid=1045的网络流方法做就AC了。

建图:先用#把整个地图围一圈,把所有点分成ab两种点,源点向a建边,b点向汇点建边。对地图上的所有*,找它左端第一个#设为A,上端第一个#设为B,A的a点向B的b点建边。所建边容量都为1.

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int NO=57;
const int INF=1000000000;
struct X
{
    int x,y;
    X(){x=y=0;}
    X(int a,int b){x=a;y=b;}
}map[NO][NO],u[NO*NO*4],v[NO*NO*4],st,ed,r[NO][NO],c[NO][NO];
char MAP[NO][NO];
int n,m;
int first[NO*2][NO*2],next[NO*NO*4],w[NO*NO*4],num;
int dis[NO*2][NO*2];
int ans[NO][NO];
void reset_first()
{
    int i,j;
    num=0;
    for(i=0;i<=ed.x;i++)
        for(j=0;j<=ed.y;j++)
            first[i][j]=-1;
}
void add(int x1,int y1,int x2,int y2,int c)
{
    u[num].x=x1,u[num].y=y1;
    v[num].x=x2,v[num].y=y2;
    w[num]=c;
    next[num]=first[x1][y1];
    first[x1][y1]=num++;

    u[num].x=x2,u[num].y=y2;
    v[num].x=x1,v[num].y=y1;
    w[num]=0;
    next[num]=first[x2][y2];
    first[x2][y2]=num++;
}
void reset_dis()
{
    int i,j;
    for(i=0;i<=ed.x;i++)
        for(j=0;j<=ed.y;j++)
            dis[i][j]=-1;
}
bool bfs()
{
    int i;
    X a;
    reset_dis();
    queue<X> t;
    t.push(st);
    dis[st.x][st.y]=0;
    while(!t.empty())
    {
        a=t.front();
        t.pop();
        for(i=first[a.x][a.y];i!=-1;i=next[i])
            if(w[i]&&dis[v[i].x][v[i].y]==-1)
            {
                dis[v[i].x][v[i].y]=dis[a.x][a.y]+1;
                t.push(v[i]);
            }
    }
    return dis[ed.x][ed.y]!=-1;
}
int min(int a,int b){return a<b?a:b;}
int dfs(const X &k,int MIN)
{
    if(k.x==ed.x&&k.y==ed.y)
        return MIN;
    int sum=0,a,i;
    for(i=first[k.x][k.y];i!=-1&&sum<MIN;i=next[i])
        if(w[i]&&dis[v[i].x][v[i].y]==dis[k.x][k.y]+1&&(a=dfs(v[i],min(MIN-sum,w[i]))))
        {
            w[i]-=a;
            w[i^1]+=a;
            sum+=a;
        }
    if(!sum)
        dis[k.x][k.y]=-1;
    return sum;
}
int DANIC()
{
    int ans=0,a;
    while(bfs())
        while(a=dfs(st,INF))
            ans+=a;
    return ans;
}
void read()
{
    for(int i=0;i<=n+1;i++)
        MAP[i][0]=MAP[i][m+1]=‘#‘;
    for(int j=0;j<=m+1;j++)
        MAP[0][j]=MAP[n+1][j]=‘#‘;
    for(int i=1;i<=n;i++)
    {
        getchar();
        for(int j=1;j<=m;j++)
            MAP[i][j]=getchar();
    }
    for(int i=0;i<=n+1;i++)
        for(int j=0;j<=m+1;j++)
            if(MAP[i][j]==‘#‘)
            {
                ans[i][j]=-1;
                map[i][j].x=MAP[i+1][j]!=‘#‘;
                map[i][j].y=MAP[i][j+1]!=‘#‘;
            }
            else
                ans[i][j]=map[i][j].x=map[i][j].y=0;
}
void build()
{
    int i,j,k;
    for(i=0;i<=n;i++)
        for(j=0;j<=m;j++)
        {
            if(map[i][j].x)
            {
                for(k=0;i+k+1<=n;k++)
                    if(ans[i+k+1][j]==-1)
                        break;
                    else
                        c[i+k+1][j].x=i,c[i+k+1][j].y=j;
                add(n+i,m+j,ed.x,ed.y,1);
            }
            if(map[i][j].y)
            {
                for(k=0;j+k+1<=m;k++)
                    if(ans[i][j+k+1]==-1)
                        break;
                    else
                        r[i][j+k+1].x=i,r[i][j+k+1].y=j;
                add(st.x,st.y,i,j,1);
            }
        }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(MAP[i][j]==‘*‘)
                add(r[i][j].x,r[i][j].y,n+c[i][j].x,m+c[i][j].y,1);
}
int main()
{

    int ttt;
    scanf("%d",&ttt);
    while(ttt--)
    {
        scanf("%d%d",&n,&m);
        ed.x=n*2+1;ed.y=m*2+1;
        reset_first();
        read();
        build();
        printf("%d\n",DANIC());
    }
    return 0;
}

时间: 2024-08-13 17:51:30

HDU5093【最大流】的相关文章

对IO流的操作(文件大小,拷贝,移动,删除)

import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.SequenceInputStream; class LjyFileClass { /*LjyFileClass工具类使用需知: * * 1.计算

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

Java学习之IO流三

1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中(高效流) 1 /** 2 * 1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 3 * @author vanguard 4 * 5 */ 6 public class Demo01 { 7 public static void main(String[] args) { 8 //键盘输入两个文件夹路径 9 Scanner sc = new Scanner(System.in); 1

标准文档流

标准流指的是在不使用其他的与排列和定位相关的特殊CSS规则时,各种元素的排列规则.HTML文档中的元素可以分为两大类:行内元素和块级元素.       1.行内元素不占据单独的空间,依附于块级元素,行内元素没有自己的区域.它同样是DOM树中的一个节点,在这一点上行内元素和块级元素是没有区别的.       2.块级元素总是以块的形式表现出来,并且跟同级的兄弟块依次竖直排列,左右自动伸展,直到包含它的元素的边界,在水平方向不能并排.盒子在标准流中的定位原则margin控制的是盒子与盒子之间的距离,

Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类

一.Properties 类(java.util)     概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,properties集合的key和value都是固定的数据类型(String),该集合提供了一些特有的方法存取值,是唯一一个可以与IO流相结合的集合; 定义:public class Properties extends Hashtable

14. 流、文件和IO

前言 InputStream/OutStream流用来处理设备之间的数据传输 Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基本类型.对象.本地化字符集等等. 一个流可以理解为一个数据的序列.输入流表示从一个源读取数据,输出流表示向一个目标写数据. 流按操作数据分为两种:字节流与字符流 按流向分为:输入流(InputStream)和输出流(OutputStream) Java 为 I/O 提供了强大的而

videojs集成--播放rtmp流

之前说到已经把流推送过来了,这时候就可以使用videojs来进行显示播放. 首先要先有一个文件,那就是video-js.swf 因为,这种播放方式html已经不能很好的进行播放了,需要用到flash来播放,videojs在这个地方就用到了这个. 代码就是下面这样. 里面一些细节注释都有. 重点就是看<video>标签里面的内容 [html] view plain copy <!DOCTYPE html> <html lang="en"> <he

快速入门系列--WCF--06并发限流、可靠会话和队列服务

这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的事务知识做一定补充. 对于WCF服务来说,其寄宿在一个资源有限的环境中,为了实现服务性能最大化,需要提高其吞吐量即服务的并发性.然而在不进行流量控制的情况下,并发量过多,会使整个服务由于资源耗尽而崩溃.因此为相对平衡的并发数和系统可用性,需要设计一个闸门(Throttling)控制并发的数量. 由于

Java中I/O流之数据流

Java 中的数据流: 对于某问题:将一个 long 类型的数据写到文件中,有办法吗?    转字符串 → 通过 getbytes() 写进去,费劲,而且在此过程中 long 类型的数需要不断地转换. 现在,Java 中的数据流能够很好的解决这个问题(不需要转换,直接写进去) 1. DataInputStream 与 DataOutputStream 分别继承自 InputStream.OutputStream, 它属于处理流,需要分别套接在 InputStream.OutputStream 类