testA

输入文件:
testA.in 输出文件testA.out
时限2000ms

问题描述:

有一个城市拥有N个节点,被M条有权无向路径连接。现在你要在一个地方(可以在路径上当然也可以在节点上)开设一家咖啡馆,使得所有节点达到这个咖啡馆的最短路里面最大值最小(也就是说离咖啡馆最远的节点距离尽可能得小),求出这个最大值的最小值。

输入描述:

第一行N和M。

第2至M+1行,每行三个整数U,V,W。表示从U到V有一条权值为W的无向边。

输出描述:

一行一个数表示答案。四舍五入至2位小数

数据范围N<=200 , W<=100000 , M<=19900

样例输入:

3
2
1 2 100
2 3 1

样例输出:

50.50

这道题考场上我是直接输出了最小生成树的重心。是当时我误认为在这道题里面,最小生成树可以等效为最短路树。

正解是二分答案,判断是否有任何一条边可以安咖啡馆。

至少A了后觉得这道题的确很简单。

还有以后要注意关于交题前要删注释,小数位数按题目所说的写。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXV 170000
#define MAXE 170000
#define MAXN 900
#define PROB "testA"
#define INF 0x3f3f3f3f
struct Edge
{
int np,val;
Edge *next;
bool flag;
}E[MAXE],*V[MAXV];
int m,n;
int map[MAXN][MAXN];
struct aaa
{
int x,y,d;
}el[MAXE];
int tope=-,topl=-;
void addedge(int x,int y,int z)
{
el[++topl].x=x;
el[topl].y=y;
el[topl].d=z;
E[++tope].np=y;
E[tope].val=z;
E[tope].next=V[x];
V[x]=&E[tope];
E[++tope].np=x;
E[tope].val=z;
E[tope].next=V[y];
V[x]=&E[tope];
}
void init()
{
int i,j,k;
for (i=;i<=n;i++)
{
for (j=;j<=n;j++)
{
for (k=;k<=n;k++)
{
if (map[j][k]>map[j][i]+map[i][k])
map[j][k]=map[j][i]+map[i][k];
}
}
}
}
pair<int,int> seg[MAXN];
int tops=-,rg;
void set_range(int x)
{
tops=-;
rg=x;
}
void add_seg(int x,int y)
{
tops++;
if (x>y)throw "E";
seg[tops].first=x;
seg[tops].second=y;
}
bool full()
{
int i,x=;
sort(seg,&seg[tops+]);
for (i=;i<=tops;i++)
{
if (x<seg[i].first)return false;
if (x>seg[i].second)continue;
x=seg[i].second+;
}
if (x>rg)return true;
return false;
}
int main()
{ freopen(PROB".in","r",stdin);
// freopen(PROB".out","w",stdout);
int i,j,k,x,y,z;
scanf("%d%d",&n,&m);
memset(map,INF,sizeof(map));
for (i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&z);
addedge(y,x,z*);
map[x][y]=map[y][x]=min(map[x][y],z*);
}
for (i=;i<=n;i++)map[i][i]=;
init();
int l,r,mid;
l=;r=;
int flag=-;
while (l+<r)
{
mid=(l+r)/;
flag=;
for (i=;i<=topl;i++)
{
set_range(el[i].d);
for (j=;j<=n;j++)
{
x=mid-map[el[i].x][j];
y=mid-map[el[i].y][j];
if (x<&&y<)
{
add_seg(,el[i].d);
break;
}
if (x>=el[i].d||y>=el[i].d)
{
continue;
}
if (x+y>=el[i].d)
{
continue;
}
add_seg(max(,x+),min(el[i].d,el[i].d-y-)); }
if (!full())flag=;
if (flag==)
break;
}
if (flag==)
{
l=mid;
continue;
}
if (flag==)
{
r=mid;
continue;
}
}
double ans=r/2.0;
printf("%.2lf",ans);
return ;
}

Contest20140705 testA 二分的更多相关文章

  1. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  2. BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]

    2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 3352  Solved: 919[Submit][Stat ...

  3. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  4. [bzoj2653][middle] (二分 + 主席树)

    Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...

  5. [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二

    Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...

  6. [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  7. jvascript 顺序查找和二分查找法

    第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...

  8. BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流

    1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...

  9. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

随机推荐

  1. hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

    三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象 ...

  2. Paxos算法之旅(四)zookeeper代码解析--转载

    ZooKeeper是近期比较热门的一个类Paxos实现.也是一个逐渐得到广泛应用的开源的分布式锁服务实现.被认为是Chubby的开源版,虽然具体实现有很多差异.ZooKeeper概要的介绍可以看官方文 ...

  3. MVC缓存,使用数据层缓存,添加或修改时让缓存失效

    在"MVC缓存01,运用控制器缓存或数据层缓存"中,在数据层中可以设置缓存的有用时刻.但这个还不够"智能",常常期望在修改或创立的时分使缓存失效,加载新的数据. ...

  4. Spring读书笔记-----Spring的Bean之设置Bean值

    [java] view plaincopyprint? Java实例的属性值可以有很多种数据类型.基本类型值.字符串类型.java实例甚至其他的Bean实例.java集合.数组等.所以Spring允许 ...

  5. PHP 时间函数集合

    计算指定日期的前几天,几个月或者几年的函数 $a = '2014/08/21';echo date( "Y-m-d", strtotime( "-6 month  &qu ...

  6. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  7. 一个少了context的赋值的错误

    错误类型如下,怎么也找不到错误,后来仔细看了源代码,原来忘了context的赋值,只是声明,声明后不马上引用到值容易出事. 11-12 15:00:09.877: E/AndroidRuntime(6 ...

  8. SQL-Server索引漫谈

    http://www.cnblogs.com/teroy/archive/2013/05/23/3070547.html

  9. CI 笔记,使用 json的参考文档(废弃)

    Json的处理转换, Json转换步骤, a)         先设置json为空字符串, b)         While循环,遍历, While(!!$row = mysql_fetch_arra ...

  10. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...