POJ 1944 - Fiber Communications
原题地址:http://poj.org/problem?id=1944
题目大意:有n个点排成一圈,可以连接任意两个相邻的点,给出 p 对点,要求这 p 对点必须直接或间接相连,求最少的连接边数
数据范围:n <= 1000, p <= 10000
算法分析:
一开始当最小生成树做的,才发现自己 SB 了……
先考虑不是环形而是线形的结构,直接贪心连接每两个点之间的所有点就好了。这样我们可以枚举环形的断点,然后逐次贪心,求最小解即可
很多同学在贪心的时候应用了线段树是复杂度高达O(np log n),其实丝毫没有必要,我们只需要每次断点时生成一个数组,在每对点的左边点处加1,再在右边点处减1,然后求一下部分和,部分和中正数的个数即为所求(详见代码)
参考代码:
//date 20140205
#include <cstdio>
#include <cstring> const int maxn = ;
const int maxp = ;
const int INF = 0x7F7F7F7F; inline void swap(int &a, int &b){int x = a; a = b; b = x;}
inline int min(int a, int b){return a < b ? a : b;} int n, p;
int pa[maxp][];
int s[maxn << ]; int main()
{
scanf("%d%d", &n, &p);
for(int i = ; i <= p; ++i)
{
scanf("%d%d", &pa[i][], &pa[i][]);
if(pa[i][] > pa[i][])swap(pa[i][], pa[i][]);
} int ans = INF;
for(int i = ; i <= n; ++i)
{
memset(s, , sizeof s);
for(int j = ; j <= p; ++j)
{
int x = pa[j][], y = pa[j][];
if(x <= i)x += n;
if(y <= i)y += n;
if(x > y)swap(x, y);
++s[x]; --s[y];
}
int now = , res = ;
for(int j = ; j <= n; ++j)
{
now += s[i + j];
if(now > )++res;
}
ans = min(ans, res);
}
printf("%d\n", ans);
return ;
}
POJ 1944 - Fiber Communications的更多相关文章
- POJ 1944 Fiber Communications (枚举 + 并查集 OR 线段树)
题意 在一个有N(1 ≤ N ≤ 1,000)个点环形图上有P(1 ≤ P ≤ 10,000)对点需要连接.连接只能连接环上相邻的点.问至少需要连接几条边. 思路 突破点在于最后的结果一定不是一个环! ...
- POJ 1944:Fiber Communications
Fiber Communications Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4236 Accepted: 1 ...
- [USACO2002][poj1944]Fiber Communications(枚举)
Fiber Communications Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3804 Accepted: 1 ...
- POJ1944 Fiber Communications (USACO 2002 February)
Fiber Communications 总时间限制: 1000ms 内存限制: 65536kB 描述 Farmer John wants to connect his N (1 <= N ...
- TOJ1550: Fiber Communications
1550: Fiber Communications Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByteTotal ...
- POJ 2579 Fiber Network(状态压缩+Floyd)
Fiber Network Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3328 Accepted: 1532 Des ...
- usaco 2002 月赛 Fiber Communications 题解
Description Farmer John wants to connect his N (1 <= N <= 1,000) barns (numbered 1..N) with a ...
- POJ 2570 Fiber Network(最短路 二进制处理)
题目翻译 一些公司决定搭建一个更快的网络.称为"光纤网". 他们已经在全世界建立了很多网站.这 些网站的作用类似于路由器.不幸的是,这些公司在关于网站之间的接线问题上存在争论,这样 ...
- ZOJ 1967 POJ 2570 Fiber Network
枚举起点和公司,每次用DFS跑一遍图,预处理出所有的答案.询问的时候很快就能得到答案. #include<cstdio> #include<cmath> #include< ...
随机推荐
- 鼠标滚轮事件MouseWheel
其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+,Chrome)中,都提供了 "mousewheel" 事件.但杯具的是 Firefox ...
- HDU 1715 大菲波数(JAVA, 简单题,大数)
题目 //BigInteger 和 BigDecimal 是在java.math包中已有的类,前者表示整数,后者表示浮点数 import java.io.*; import java.util.*; ...
- 获取及管理Android 手机运营商及状态
主要类 TelephonyManager: telephonyManager.getCellLocation();//获得服务区 telephonyManager.getCellId();//获得服务 ...
- Win7系统配置IIS7服务
1.开启IIS7服务 打开控制面板,选择并进入“程序”,双击“打开或关闭Windows服务”,在弹出的窗口中选择“Internet信息服务”下面所有地选项,点击确定后,开始更新服务. 2.安装web文 ...
- 初学Ajax(三)
$.ajax() $.ajax()是所有ajax方法中最底层的方法,所有其他方法都是基于$.ajax()方法的封装.这个方法只有一个参数,传递一个各个功能键值对的对象. $.ajax()方法对象参数表 ...
- iOS 开发--多线程
前面在<Bison眼中的iOS开发多线程是这样的(二)>一文中讲完了多线程的NSThread,不难发现这种方式的多线程实现起来非常的复杂,为了简化多线程的开发,iOS提供了GCD来实现多线 ...
- iOS开发-UISlider改变图片透明度
拖动条是通过滑块的位置来标识数值,而且拖动条允许用户拖动滑块来改变值.因此,拖动条通常用于对系统的某种数值进行调节,如调节亮度,透明度,音量等. 一.属性介绍 @property(nonatomic) ...
- jquery.lazyload用法
lazyload是jquery的插件,作为延迟加载图片,减压服务器压力. 如何使用: 先把 <script src="jquery.js" type="text/j ...
- My SQL InnoDB 1217 - Cannot delete or update a parent row:aforeign key constraint fals
InnoDB 允许有外键 MyISAM 不允许有外键 InnoDB修改成MyISAM 证明有外键 一张表如果有其他表的外键关联的是它 它也不能是MyISAM 来自为知笔记(Wiz)
- Qt通过UDP传图片,实现自定义分包和组包
一.包头结构体 //包头 struct PackageHeader { //包头大小(sizeof(PackageHeader)) unsigned int uTransPackageHdrSize; ...