P1653 [USACO04DEC] Cow Ski Area G

 

 :::行列关系 反复 检查

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=1e6+10;

int head[maxn],to[maxn<<1],nxt[maxn<<1],tot;
int dfn[maxn],low[maxn],dfstm,st[maxn],top,co[maxn],col;
int a[510][510],rd[maxn],cd[maxn];
int w,l,ans1,ans2;

void add(int u,int v){
    to[++tot]=v,nxt[tot]=head[u],head[u]=tot;
}
void lianjie(int x,int y,int u,int v){
    if(x<1||x>l||u<1||u>l||y<1||y>w||v<1||v>w) return;
    if(a[x][y]<a[u][v]) return;
    add((x-1)*w+y,(u-1)*w+v);
}
void tarjan(int u)
{
    dfn[u]=low[u]=++dfstm;st[++top]=u;
    for(int i=head[u];i;i=nxt[i])
    {
        int v=to[i];
        if(dfn[v]==0){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(co[v]==0) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u])
    {
        co[u]=++col;
        while(st[top]!=u)
        {
            co[st[top]]=col;
            top--;
        }
        top--;
    }
}
int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>w>>l;
    for(int i=1;i<=l;i++){
        for(int j=1;j<=w;j++)
            cin>>a[i][j];    
    }
    for(int i=1;i<=l;i++){//l hang w lie
        for(int j=1;j<=w;j++){
            lianjie(i,j,i,j-1);//i-> 1~l
            lianjie(i,j,i+1,j);
            lianjie(i,j,i,j+1);
            lianjie(i,j,i-1,j);
        }    
    }

    for(int i=1;i<=w*l;i++) if(dfn[i]==0) tarjan(i);
    
    if(col==1){ cout<<"0"<<'\n';return 0; }
    
    for(int i=1;i<=w*l;i++){
        for(int j=head[i];j;j=nxt[j]){
            int v=to[j];
            if(co[v]!=co[i]) rd[co[v]]++,cd[co[i]]++;
        }
    }
    for(int i=1;i<=col;i++){
        if(rd[i]==0) ans1++;
        if(cd[i]==0) ans2++;
    }
    cout<<max(ans1,ans2)<<'\n';
    
    return 0;
}
View Code

 

 
posted @ 2023-08-13 13:11  JMXZ  阅读(11)  评论(0)    收藏  举报