电话线

  题目大意:一堆电话线要你接,现在有N个接口,总线已经在1端,要你想办法接到N端去,电话公司发好心免费送你几段不用拉网线,剩下的费用等于剩余最长电话线的长度,要你求出最小的费用。

  这一看又是一个最小化最大值的问题(也可以看成是最大化最小值的问题),常规方法一样的就是把这个费用二分就好,但是这道题是道图论题,不一定经过所有的点,那我们就以二分基准长度为界限,把小于基准长度的那一部分看成是0,大于等于基准长度的看成是1,这样我们只用SPFA算法算最短路径就可以了,非常的巧妙

  参考:http://poj.org/showmessage?message_id=181794

  PS:好久没写SPFA了,都忘记是怎么写了,重新定义长度的时候又忘记乘以2了WA一个晚上真是日了

  

 #include <iostream>
#include <algorithm>
#include <functional>
#define SIZE 1010 using namespace std;
typedef int Position; struct _set
{
Position ed;
int next;
int length;
}Path[];
struct _head
{
int point;
}Heads[SIZE];
static int dist[SIZE];
static bool visit[SIZE], oep[];
static Position que[(SIZE + ) * ]; void solve(const int, const int, const int, const int);
bool SPFA(const int, const int, const int, const int); int main(void)
{
int Sum_Poles, Free_Cables, Sum_Path, length, L_Max;
Position st, ed; while (~scanf("%d%d%d", &Sum_Poles, &Sum_Path, &Free_Cables))
{
L_Max = -;
for (int i = ; i <= Sum_Poles; i++)
Heads[i].point = -;
for (int i = ; i < * Sum_Path;)
{
scanf("%d%d%d", &st, &ed, &length);
//无向图,两边都要存
Path[i].ed = ed; Path[i].length = length; Path[i].next = Heads[st].point;
Heads[st].point = i++; Path[i].ed = st; Path[i].length = length; Path[i].next = Heads[ed].point;
Heads[ed].point = i++; L_Max = max(L_Max, length);
}
solve(Sum_Poles, Sum_Path, Free_Cables, L_Max);
}
return ;
} void solve(const int Sum_Poles, const int Sum_Path, const int Free_Cables, const int L_Max)
{
int lb = , rb = L_Max + , mid; while (rb - lb > )//对距离二分
{
mid = (lb + rb) >> ;
if (SPFA(mid, Sum_Path, Sum_Poles, Free_Cables)) lb = mid;
else rb = mid;
if (dist[Sum_Poles] == 0x3fffffff)
//任何一次寻找过后,如果图能到N点,那么N的dist值一定不是0x3fffffff
//否则,一定是不联通
{
printf("-1\n");
return;
}
}
printf("%d\n", lb);
} bool SPFA(const int x, const int Sum_Path, const int Sum_Poles, const int Free_Cables)
{
int head = , back = , out, to; que[head] = ; //开始是从1开始的 for (int i = ; i < * Sum_Path; i++)
oep[i] = Path[i].length < x ? : ; fill(dist, dist + Sum_Poles + , 0x3fffffff);
memset(visit, , sizeof(visit));
dist[] = ; while (head != back)
{
out = que[head]; head = (head + ) % ( * SIZE);
visit[out] = ; for (int k = Heads[out].point; k != -; k = Path[k].next)
{
to = Path[k].ed;
if (dist[out] + oep[k] < dist[to])
{
dist[to] = dist[out] + oep[k];
if (!visit[to])
{
visit[to] = ;
que[back] = to; back = (back + ) % ( * SIZE);
}
}
}
}
return dist[Sum_Poles] > Free_Cables;
}

Divide and conquer:Telephone Lines(POJ 3662)的更多相关文章

  1. Telephone Lines POJ - 3662 (二分+spfa)

    Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncoop ...

  2. Divide and conquer:K Best(POJ 3111)

     挑选最美的珠宝 题目大意:挑选k个珠宝使得∑a/∑b最大,输出组合数 最大化平均值的标准题型,二分法就好了,一定要注意范围(10e-7),如果是10e-8就会tle,10e-6就是wa #inclu ...

  3. Divide and conquer:Dropping tests(POJ 2976)

    最大化平均值 题目大意:给定你n个分数,从中找出k个数,使∑a/∑b的最大值 这一题同样的也可以用二分法来做(用DP会超时,可见二分法是多么的实用呵!),大体上是这样子:假设最大的平均值是w,那么题目 ...

  4. Divide and conquer:Aggressive Cows(POJ 2456)

    侵略性的牛 题目大意:C头牛最大化他们的最短距离 常规题,二分法即可 #include <iostream> #include <algorithm> #include < ...

  5. Divide and Conquer:Cable Master(POJ 1064)

    缆绳大师 题目大意,把若干线段分成K份,求最大能分多长 二分法模型,C(x)就是题干的意思,在while那里做下文章就可以了,因为这个题目没有要求长度是整数,所以我们要不断二分才行,一般50-100次 ...

  6. Divide and Conquer:Monthly Expense(POJ 3273)

    Monthly Expense 题目大意:不废话,最小化最大值 还是直接套模板,不过这次要注意,是最小化最大值,而不是最大化最小值,判断的时候要注意 联动3258 #include <iostr ...

  7. Divide and Conquer:River Hopscotch(POJ 3258)

     去掉石头 题目大意:一群牛在河上的石头上跳来跳去,现在问你如何通过去掉M个石头,使得牛跳过石头的最短距离变得最大? 这一题比较经典,分治法的经典,二分法可以很方便处理这个问题,我们只要明白比较函数这 ...

  8. POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7214   Accepted: 2638 D ...

  9. (poj 3662) Telephone Lines 最短路+二分

    题目链接:http://poj.org/problem?id=3662 Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total ...

随机推荐

  1. 使用jQuery的Scrollify插件实现鼠标滚轮或者手势滑动到页面下一节点部分

    有时我们需要做一个单页面介绍产品特性,而单页面内容非常多且页面非常长,为了快速定位到产品特性节点,我们使用js侦听用户滚轮事件,当用户触发滚轮滑动或者使用手势触屏滑动时,即可定位到相应的节点.一款jQ ...

  2. R入门-第一次写了一个完整的时间序列分析代码

    纪念一下,在心心念念想从会计本科转为数据分析师快两年后,近期终于迈出了使用R的第一步,在参考他人的例子前提下,成功写了几行代码.用成本的角度来说,省去了部门去买昂贵的数据分析软件的金钱和时间,而对自己 ...

  3. 浏览器兼容性之Css篇

    本文与上一篇随笔<浏览器兼容性之Javascript篇>有一定关联,下来我会继续不断总结,旨在解决浏览器兼容性,对遇到类似问题的同仁有所帮助,如有更多解决浏览器兼容性的案例还望大家分享一起 ...

  4. 如何编译Apache Hadoop2.6.0源代码

    如何编译Apache Hadoop2.6.0源代码 1.安装CentOS 我使用的是CentOS6.5,下载地址是http://mirror.neu.edu.cn/centos/6.5/isos/x8 ...

  5. 基于jQuery的对象切换插件:soChange 1.5 (点击下载)

    http://www.jsfoot.com/jquery/demo/2011-09-20/192.html 所有参数: $(obj).soChange({     thumbObj:null, //导 ...

  6. HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...

  7. BZOJ4034——[HAOI2015]T2

    1.题目大意:用一个数据结构支持树的点修改和子树修改.树上路径和 2.分析:树链剖分裸题 #include <cstdio> #include <cstdlib> #inclu ...

  8. TP5的图片上传

    public function upload(){ // 获取表单上传文件 例如上传了001.jpg $file = request()->file('image'); $picture=mod ...

  9. metasploit连接数据库

    表示一直出问题.不造哪里出错.望有知情人与本人取得联系! test

  10. Genymotion加速下载虚拟镜像速度慢失败Connection timeout

    Genymotion也算是个android的模拟程序了, Add new device后下载速度太慢了,容易失败 解决方法有二: 1.设置HTTP代理,在Setting->Network,自己设 ...