当前位置: 首页 > news >正文

POJ 2375

思路:
Tarjan缩点+一些特判

//By SiriusRen
#include <stack>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
stack<int>stk;
int n,m,map[666][666],xx[]={1,-1,0,0},yy[]={0,0,1,-1};
int v[1001000],next[1001000],first[1001000],tot=0,ans1=0,ans2=0;
int low[1001000],dfn[1001000],cnt=0,vis[1001000],t=0,p[1001000],out[1001000],in[1001000];
bool check(int sx,int sy,int x,int y)
{
    return map[sx][sy]>=map[x][y]&&x>=1&&x<=n&&y>=1&&y<=m;
}
void add(int x,int y){v[tot]=y,next[tot]=first[x];first[x]=tot++;}
void tarjan(int x)
{
    dfn[x]=low[x]=++cnt;
    vis[x]=1;stk.push(x); 
    for(int i=first[x];~i;i=next[i])
    {
        if(!dfn[v[i]])tarjan(v[i]),low[x]=min(low[x],low[v[i]]);
        else if(vis[v[i]])low[x]=min(low[x],dfn[v[i]]);
    }
    if(low[x]==dfn[x])
    {
        t++;
        int temp;
        do
        {
            temp=stk.top();stk.pop();
            vis[temp]=0;
            p[temp]=t;
        }while(temp!=x);
    }
}
int main()
{
    memset(first,-1,sizeof(first));
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&map[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            for(int k=0;k<=3;k++)
            {
                if(check(i,j,i+xx[k],j+yy[k]))
                {
                    add(i*m+j,(i+xx[k])*m+j+yy[k]);
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(!dfn[i*m+j])
            {
                tarjan(i*m+j);
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            for(int k=0;k<=3;k++)
            {
                if(check(i,j,i+xx[k],j+yy[k])&&p[i*m+j]!=p[(i+xx[k])*m+j+yy[k]])
                {
                    out[p[i*m+j]]++;in[p[(i+xx[k])*m+j+yy[k]]]++;
                }
            }
        }
    }
    for(int i=1;i<=t;i++)
    {
        if(!out[i])ans1++;
        if(!in[i])ans2++;
    }
    if(t>1)printf("%d",max(ans1,ans2));
    else putchar('0');
}

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532331.html

相关文章:

  • 关于SQL镜像配置报错
  • 共享库
  • Oracle 函数返回表实例2种写法实例
  • 重走java--Step 2
  • 高并发系统之队列术
  • servlet 开发出错原因分析
  • java--集合框架
  • 粗浅看Struts2和Hibernate框架
  • Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
  • jquery内容选择器(匹配包含指定选择器的元素)
  • Unity3D Shader入门指南(转)
  • 文件上传大小限制问题
  • 百度地图路线检索(3)
  • 《徐徐道来话Java》(1):泛型的基本概念
  • Maven Multi-environment package
  • “大数据应用场景”之隔壁老王(连载四)
  • AWS实战 - 利用IAM对S3做访问控制
  • ERLANG 网工修炼笔记 ---- UDP
  • Java反射-动态类加载和重新加载
  • Linux Process Manage
  • nginx 负载服务器优化
  • Phpstorm怎样批量删除空行?
  • spring + angular 实现导出excel
  • spring cloud gateway 源码解析(4)跨域问题处理
  • spring学习第二天
  • SSH 免密登录
  • Zsh 开发指南(第十四篇 文件读写)
  • 高程读书笔记 第六章 面向对象程序设计
  • 回流、重绘及其优化
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端面试之CSS3新特性
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 回归生活:清理微信公众号
  • 交换综合实验一
  • ​flutter 代码混淆
  • !!java web学习笔记(一到五)
  • #android不同版本废弃api,新api。
  • #QT项目实战(天气预报)
  • (C#)获取字符编码的类
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)windows配置JDK环境
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (新)网络工程师考点串讲与真题详解
  • (转)http-server应用
  • (转)Linq学习笔记
  • (转)ORM
  • *1 计算机基础和操作系统基础及几大协议
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .dwp和.webpart的区别
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库