栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 2375 Cow Ski Area

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 2375 Cow Ski Area

#include <stdio.h>#include <string.h>#include <algorithm>#include <vector>using namespace std;#define snuke(it,x) for (vector<int>::iterator it = (x).begin();     it != (x).end(); it ++)const int N = 255555;int dfn[N],low[N],belong[N],stack[N],instack[N],tot,top,tim,n,m,in[N],out[N];struct edge {int v,next;}g[2001000];int head[N],etot;void add_edge(int u,int v) {        g[etot].v = v; g[etot].next = head[u]; head[u] = etot ++;}void tarjan(int u) {        dfn[u] = low[u] = ++tim;        stack[top++] = u;        instack[u] = 1;        for (int i = head[u]; i != -1; i = g[i].next) {     int v = g[i].v;     if (!dfn[v]) {  tarjan(v);  low[u] = min(low[u],low[v]);     } else if (instack[v]) {  low[u] = min(low[u],low[v]);     }        }        if (dfn[u]==low[u]) {     while (true) {  int v = stack[--top];  instack[v] = 0;  belong[v] = tot;  if (v==u) break;     }     tot ++;        }}void scc() {        tot = tim = top = 0;        memset(instack,0,sizeof(instack));        memset(dfn,0,sizeof(dfn));        for (int i = 0; i < n*m; i ++) if (!dfn[i]) tarjan(i);}int mat[555][555];int main() {        while (scanf("%d%d",&m,&n)==2) {     for (int i = 0; i < n*m; i ++) {  head[i] = -1;  in[i] = out[i] = 0;     }     etot = 0;     for (int i = 0; i < n; i ++) {  for (int j = 0; j < m; j ++) {          scanf("%d",&mat[i][j]);          if (i) {       int val = mat[i-1][j];       int u = i*m+j,v = (i-1)*m+j;       if (val>=mat[i][j]) add_edge(v,u);       if (val<=mat[i][j]) add_edge(u,v);          }          if (j) {       int val = mat[i][j-1];       int u = i*m+j,v = i*m+j-1;       if (val>=mat[i][j]) add_edge(v,u);       if (val<=mat[i][j]) add_edge(u,v);          }  }     }     scc();     if (tot==1) {  puts("0");  continue;     }     for (int i = 0; i < n*m; i ++) {  for (int j = head[i]; j != -1; j = g[j].next) {          int v = g[j].v;          if (belong[i]!=belong[v]) {       out[belong[i]] ++;       in[belong[v]] ++;          }  }     }     int a = 0,b = 0;     for (int i = 0; i < tot; i ++) {  a += in[i]==0;  b += out[i]==0;     }     printf("%dn",max(a,b));        }        return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373122.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号