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 ...
最新文章
- linux shell读取文件
- Java8 - 接口默认方法
- iOS在label中显示表情
- 记录华为P40Pro+系列相机参数总结
- 文巾解题 1480. 一维数组的动态和
- 笔记整理-知识产权与标准化知识-GB/T11457-2006软件工程术语
- leetcode刷题 60 61
- LeetCode 1669合并两个链表-中等
- Deformable-DETR的学习笔记
- 一个基于vue和element-ui的树形穿梭框组件
- DSP双线性变换详解
- C#链接各种数据库代码总结
- DeepFaceLab
- 计算机文件夹操作有哪些,电脑操作常用的快捷键有哪些
- 摩尔定律已经走到尽头?
- 高数定理、法则(持续添加)
- Java资深开发:这不得40k起步呀
- 点集拓扑学的历史介绍
- python :turtle画笔设置函数
- 操作系统学习(第一章————第二章)
热门文章
- 图像处理: 设计 自定义透明度 水印
- 投入OJ的怀抱~~~
- uni-app 微信小程序 腾讯地图选点插件
- 的确,人在做,天在看
- 过来人经验:程序员怎么升职加薪,迎娶白富美...
- klayout 源码分析系列续 执行脚本
- 第二十章 Caché 命令大全 QUIT 命令
- 苹果ipad怎么刷机_苹果iPhone SE 2(3GB/64GB/全网通)手机密码忘记怎么刷机?
- 计算机网络安全作文,网络安全小学生300字作文
- 用find在html中找字符串,Windows CMD中 find命令(字符串查找)