POJ 2375 Cow Ski Area 增加最小边使图强连通
题意:一个矩阵图,每一个格子有一个权值,相邻格子之间可以通,条件是一个格子可以走到相邻格子的条件是相邻格子的全是不大于当前格子,问增加多少条边使得每一个格子都可以到达任意格子
想法:tarjan缩点,之后,结果为Max(出度为0点个数,入度为0点个数)
因为这个图,没有孤立点。
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
const int N=250000+50;
const int M=2000000+50;
int w,l,n;
int map[505][505];
struct node
{int v,next;
}e[M];
stack<int>s;
int head[N],cnt;
int dfn[N],low[N],index,col,in[N],out[N],instack[N],paint[N];
void Init()
{while(!s.empty()) s.pop();memset(head,-1,sizeof(head));cnt=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(in,0,sizeof(in));memset(out,0,sizeof(out)); memset(instack,0,sizeof(instack));memset(paint,0,sizeof(paint));col=index=0;
}
void add(int a,int b)
{e[cnt].v=b;e[cnt].next=head[a];head[a]=cnt++;
}
int Min(int a,int b)
{if(a<b) return a;return b;
}
void tarjan(int u)
{dfn[u]=low[u]=++index;instack[u]=1;s.push(u);for(int i=head[u];i+1;i=e[i].next){int v=e[i].v;if(!dfn[v]){tarjan(v);low[u]=Min(low[u],low[v]);}else if(instack[v]){low[u]=Min(low[u],dfn[v]);}}if(dfn[u]==low[u]){++col;int k=s.top();while(k!=u){s.pop();instack[k]=0;paint[k]=col;k=s.top();}s.pop();instack[u]=0;paint[u]=col;}
}
int main()
{while(~scanf("%d%d",&w,&l)){n=w*l;Init();for(int i=1;i<=l;i++){for(int j=1;j<=w;j++){scanf("%d",&map[i][j]);}}for(int i=1;i<=l;i++){for(int j=1;j<=w;j++){int num=(i-1)*w+j;if(j+1<=w){if(map[i][j]>map[i][j+1]){add(num,num+1);}else if(map[i][j]<map[i][j+1]){add(num+1,num);}else {add(num,num+1);add(num+1,num);}}if(i+1<=l){if(map[i][j]>map[i+1][j]){add(num,num+w); }else if(map[i][j]<map[i+1][j]){add(num+w,num);}else {add(num,num+w);add(num+w,num);}}}}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}for(int i=1;i<=n;i++){for(int j=head[i];j+1;j=e[j].next){int a=i,b=e[j].v;if(paint[a]!=paint[b]){out[paint[a]]++;in[paint[b]]++;}}}int inn=0,outn=0,res;for(int i=1;i<=col;i++){if(!in[i]) inn++;if(!out[i]) outn++;}if(inn>outn) res=inn;else res=outn;if(col==1) printf("0\n");else printf("%d\n",res);}return 0;
}
POJ 2375 Cow Ski Area 增加最小边使图强连通相关推荐
- bzoj 3388: [Usaco2004 Dec]Cow Ski Area雪场缆车(Tarjan)
3388: [Usaco2004 Dec]Cow Ski Area雪场缆车 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 108 Solved: 4 ...
- POJ 3660 Cow Contest [Floyd]
POJ - 3660 Cow Contest http://poj.org/problem?id=3660 N (1 ≤ N ≤ 100) cows, conveniently numbered 1. ...
- poj 1985 Cow Marathon 【树的直径】
求树的直径 /* POJ:1985 Cow Marathon 2014/10/12/21:18 Yougth*/ #include <cstdio> #include <iostre ...
- [POJ 3270]Cow Sorting
Description Farmer John's N (1 ≤ N ≤ 10,000) cows are lined up to be milked in the evening. Each cow ...
- poj 2914(stoer_wanger算法求全局最小割)
题目链接:http://poj.org/problem?id=2914 思路:算法基于这样一个定理:对于任意s, t V ∈ ,全局最小割或者等于原图的s-t 最小割,或者等于将原图进行 Cont ...
- POJ 1325 Machine Schedule(zoj 1364) 最小覆盖数
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=364 http://poj.org/problem?id=1325 题目大意: ...
- poj Best Cow Line
Best Cow Line 题意: 就是说给你一系列字母, 要你取出字典序最小的字符串,每次只能从最上面或者最下面进行取,每次从上和从下选择最小的,若相等则向中间搜索,找到较小的. 注意: 1.先吸收 ...
- POJ Treasure Exploration 【DAG交叉最小路径覆盖】
传送门:http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K To ...
- POJ 3660 Cow Contest 传递闭包+Floyd
原题链接:http://poj.org/problem?id=3660 Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
最新文章
- java基础——java位运算
- c语言错误 xef代表什么,单片机C语言代码手册 含100多个经典C程序
- ai automatic video editing software
- ITK:像素是否在区域内
- PHP+百度地图API+JAVASCRIPT实现GPS坐标与百度坐标转换的实例
- 文档中快速输入日期时间的方法
- ios jenkins_如何使用Jenkins和Fastlane制作iOS点播构建系统
- MPI多机器实现并行计算
- oracle dba create view 失败 解决办法
- Android 对ScrollView滚动监听,实现美团、大众点评的购买悬浮效果
- rgb颜色查询工具_《我的眼睛–图灵识别》第三章:基础:颜色识别
- B9 Concurrent 重入锁(ReentrantLock)
- JAVA五子棋小游戏
- l298n电机哪一端为正_L298N使用说明介绍
- 一个Python 爬虫程序
- 云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)
- 少儿Python编程教程
- 腾讯云服务器操作系统TencentOS的正确安装方法
- 基于安卓系统(android)记事本APP管理系统设计与实现
- 学计算机编程难吗,编程真的很难吗?为什么会认为学编程难?