POJ2375 Cow Ski Area (强连通)(缩点)
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 3323 | Accepted: 919 |
Description
FR's ski area is a rectangle of width W and length L of 'land
squares' (1 <= W <= 500; 1 <= L <= 500). Each land square
is an integral height H above sea level (0 <= H <= 9,999). Cows
can ski horizontally and vertically between any two adjacent land
squares, but never diagonally. Cows can ski from a higher square to a
lower square but not the other way and they can ski either direction
between two adjacent squares of the same height.
FR wants to build his ski area so that his cows can travel between
any two squares by a combination of skiing (as described above) and ski
lifts. A ski lift can be built between any two squares of the ski area,
regardless of height. Ski lifts are bidirectional. Ski lifts can cross
over each other since they can be built at varying heights above the
ground, and multiple ski lifts can begin or end at the same square.
Since ski lifts are expensive to build, FR wants to minimize the number
of ski lifts he has to build to allow his cows to travel between all
squares of his ski area.
Find the minimum number of ski lifts required to ensure the cows can
travel from any square to any other square via a combination of skiing
and lifts.
Input
* Lines 2..L+1: L lines, each with W space-separated integers corresponding to the height of each square of land.
Output
Line 1: A single integer equal to the minimal number of ski lifts FR
needs to build to ensure that his cows can travel from any square to any
other square via a combination of skiing and ski lifts
Sample Input
9 3
1 1 1 2 2 2 1 1 1
1 2 1 2 3 2 1 2 1
1 1 1 2 2 2 1 1 1
Sample Output
3
SB题,还花了好长时间,不开心,不写题解了。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 10000
typedef long long ll;
using namespace std;
const int N=;
const int M=;
int s,t,n,m,cnt,tim,top,cut,k;
int head[M],dfn[M],low[M],stack1[M];
int num[M],in[M],out[M],vis[M],w[N][N];
int dis[][]= {,,,,-,,,-};
bool flag=false;
struct man {
int to,nxt;
} edg[M*];
void addedg(int u,int v) {
edg[cnt].to=v;
edg[cnt].nxt=head[u];
head[u]=cnt++;//printf("!!!%d %d\n",u,v);system("pause");
}
void init() {
cnt=;
tim=;
top=cut=k=;
memset(head,-,sizeof head);
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
memset(stack1,,sizeof stack1);
memset(num,,sizeof num);
memset(in,,sizeof in);
memset(out,,sizeof out);
memset(vis,,sizeof vis);
memset(edg,,sizeof edg);
memset(w,,sizeof w);
}
void Tarjan(int u) {
int v;
low[u] = dfn[u] = ++tim;
stack1[top++] = u;
vis[u] = ;
for(int e = head[u]; e != -; e = edg[e].nxt)
{
v = edg[e].to;
if(!dfn[v])
{
Tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(vis[v])
{
low[u] = min(low[u], dfn[v]);
}
}
if(low[u] == dfn[u])
{
cut++;
do
{
v = stack1[--top];
num[v] = cut;
vis[v] = ;
}while(u != v);
}
}
void build(int i,int j,int d)
{
int xx=i+dis[d][];
int yy=j+dis[d][];
int u=i*m+j,v=xx*m+yy;
if(xx>=&&yy<m&&yy>=&&xx<n){
if(w[i][j]>=w[xx][yy])addedg(u,v);
if(w[i][j]<=w[xx][yy])addedg(v,u);
}
return;
}
int main() {
while(~scanf("%d%d",&m,&n)) {
init();
for(int i=; i<n; i++) {
for(int j=; j<m; j++) {
scanf("%d",&w[i][j]);
}
}
for(int i = ; i < n; i++) {
for(int j = ; j < m; j++) {
for(int d = ; d < ; d++) {
build(i,j,d);
}
}
}
for(int i=; i<n*m; i++)if(!dfn[i])Tarjan(i);
for(int i=; i<n*m; i++) {
for(int j=head[i]; j!=-; j=edg[j].nxt) {
int v=edg[j].to;
if(num[i]!=num[v])out[num[i]]++,in[num[v]]++;
}
}
int father=,son=;
for(int i=; i<=cut; i++) {
if(in[i]==)father++;
if(out[i]==)son++;
}
if(cut==)printf("0\n");
else printf("%d\n",max(father,son));
}
return ;
}
POJ2375 Cow Ski Area (强连通)(缩点)的更多相关文章
- POJ 2375 Cow Ski Area (强连通分量)
题目地址:POJ 2375 对每一个点向与之相邻并h小于该点的点加有向边. 然后强连通缩点.问题就转化成了最少加几条边使得图为强连通图,取入度为0和出度为0的点数的较大者就可以.注意,当强连通分量仅仅 ...
- [USACO2004][poj2375]Cow Ski Area(在特殊图上用floodfill代替强联通算法)
http://poj.org/problem?id=2375 题意:一个500*500的矩形,每个格子都有一个高度,不能从高度低的格子滑到高度高的格子(但相等高度可以滑),已知可以在2个相邻格子上加桥 ...
- POJ 2375 Cow Ski Area(强连通)
POJ 2375 Cow Ski Area id=2375" target="_blank" style="">题目链接 题意:给定一个滑雪场, ...
- POJ 2375 Cow Ski Area
Cow Ski Area Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original I ...
- D - Cow Ski Area
Description Farmer John's cousin, Farmer Ron, who lives in the mountains of Colorado, has recently t ...
- poj 2375 Cow Ski Area bfs
这个题目用tarjan找联通块,缩点,然后统计出入度为0的点理论上是可行的,但问题是会暴栈.考虑到这个题目的特殊性,可以直接用一次bfs找到数字相同且联通的块,这就是一个联通块,然后缩点,统计出入度即 ...
- POJ 2375 Cow Ski Area【tarjan】
题目大意:一个W*L的山,每个山有个高度,当且仅当一个山不比它相邻(有公共边的格子)的山矮时能够滑过去,现在可以装化学电梯来无视山的高度滑雪,问最少装多少电梯使得任意两点都可到达 思路:最后一句话已经 ...
- POJ 2375 Cow Ski Area[连通分量]
题目链接:http://poj.org/problem?id=2375题目大意:一片滑雪场,奶牛只能向相邻的并且不高于他当前高度的地方走.想加上缆车是的奶牛能从低的地方走向高的地方,求最少加的缆车数, ...
- BZOJ1051 [HAOI2006]受欢迎的牛 Tarjan 强连通缩点
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1051 题意概括 有n只牛,有m个羡慕关系. 羡慕关系具有传递性. 如果A羡慕B,B羡慕C,那么我们 ...
随机推荐
- [vijos P1014] 旅行商简化版
昨天早上上课讲旅行商问题,有点难,这周抽空把3^n的算法码码看.不过这个简化版已经够折腾人了. 其一不看解析不知道这是双进程动态规划,不过我看的解析停留在f[i,j]表示第一个人走到i.第二个人走到j ...
- hadoop的RPC通信
RPC(remote procedure call)远程调用 不同的Java进程间的对象方法调用 一方称作服务端(server),一方称作客户端(client) server端提供对象,供客户端调用, ...
- [__NSCFString absoluteURL]错误的解决方案
Xcode提醒错误: -[__NSCFString absoluteURL]: unrecognized selector sent to instance 0x8c4d3a0 *** Termina ...
- 自然数n的分解
输入自然数n(n<100),输出所有和的形式.不能重复. 如:4=1+1+2:4=1+2+1;4=2+1+1 属于一种分解形式. 样例: 输入: 7 输出: 7=1+6 7=1+1+5 7=1+ ...
- self进行weak化
创建block匿名函数之前一般需要对self进行weak化,否则造成循环引用无法释放controller: __weak MyController *weakSelf = self 或者 __weak ...
- [TOP10]十大渗透测试演练系统
本文总结了目前网络上比较流行的渗透测试演练系统,这些系统里面都提供了一些实际的安全漏洞,排名不分先后,各位安全测试人员可以亲身实践如何利用这个漏洞,同时也可以学习到漏洞的相关知识. DVWA (Dam ...
- Multiple dex files define
Multiple dex files define 在项目中,有一个类的包名和引用的jar包中的类和包名一致
- openstack中运行定时任务的两种方法及源代码分析
启动一个进程,如要想要这个进程的某个方法定时得进行执行的话,在openstack有两种方式: 一种是通过继承 periodic_task.PeriodicTasks,另一种是使用loopingcall ...
- C++ inline weak symbol and so on
关于inline这个关键字,听到强调得最多的是,它只是一种对于编译器的建议,而非强制执行的限定. 但事实上,即使这个优化最终由于函数太过复杂的原因没有达成,加上inline关键字(还有在类定义中直接定 ...
- 深入分析:Fragment与Activity交互的几种方式(二,使用Bundle)
首先我们需要在Activity中动态添加Fragment时,用Bundle封装我们需要传递的数据. public void button(View view) { ArgFragment arg = ...