hdu4435 charge-station(先建后拆+bfs)
charge-station
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 617 Accepted Submission(s): 310
Building an oil station in city i will cost 2
i-1 MMMB. Please help the judge calculate out the minimum cost to build the oil stations in order to fulfill M^3's will.
Then follows N lines and line i will contain two numbers x, y(0 ≤ x, y ≤ 1000), indicating the coordinate of city i.
The distance between city i and city j will be ceil(sqrt((xi - xj)
2 + (yi - yj)
2)). (ceil means rounding the number up, e.g. ceil(4.1) = 5)
If it's impossible to visit all the cities even after all oil stations are build, output -1 instead.
0 0
0 3
0 1
3 2
0 0
0 3
0 1
3 1
0 0
0 3
0 1
16 23
30 40
37 52
49 49
52 64
31 62
52 33
42 41
52 41
57 58
62 42
42 57
27 68
43 67
58 48
58 27
37 69
111
-1
10111011
In case 1, the judge should select (0, 0) and (0, 3) as the oil station which result in the visiting route: 1->3->2->3->1. And the cost is 2^(1-1) + 2^(2-1) = 3.
输出的答案是2进制,由费用10进制转化过来就是在第i个点建立加
油站,答案从右往左数第i个值就为1。
3、解题步骤:
(1) 第一步判断所有点都建立加油站能不能完成题目的要求,不能输出-1。
能完成要求的话,我们注意到建站费用是和点的编号有关的,
比如第i个点建站的费用是等于前i-1个点都建站的费用+1,二进制的规律。
然后我们可以从后往前判断当前加油站能不能拆。
(2) dis数组存从当前点到最近的加油站的距离,判断分两个方面:
如果当前点也有加油站,dis[i] <= D就可以;
如果当前点决定不建立加油站,那么dis[i]要小于D/2;
不符合要求就不能拆这个加油站。
感想:这先建再拆的做法真是头一次见啊,不过确实很好
#include<stdio.h>
#include<math.h>
#include<string.h>
#define inf 10000000;
struct node
{
int x,y,id;
}s[130];
int D,N,st[1000000],dis[130],e[130][130],vis[130],ok[130],dist[130];
int clc(int i,int j)//向上取整
{
double ss;
int x;
ss=sqrt((double)(s[i].x-s[j].x)*(s[i].x-s[j].x)+(double)(s[i].y-s[j].y)*(s[i].y-s[j].y));
x=ss;
if(ss-x<0.000001)
return x;
else return x+1;
}
int min(int x,int y)
{
return x<y?x:y;
}
int bfs()
{
memset(vis,0,sizeof(vis));
int t=0,w=1,i,j;
for(i=1;i<=N;i++)
if(ok[i])
dis[i]=0;//本身为加油站到最近加油站距离为0
else dis[i]=inf;
st[0]=1;
vis[1]=1;
while(t<w)
{
j=st[t];
for(i=1;i<=N;i++)
{
if(!vis[i]&&e[j][i]<=D)//没访问过并且到最近加油站距离小于等于D
{
dis[i]=min(dis[i],dis[j]+e[j][i]);//更新到周围加油站的最短距离,
if(ok[i])
{
st[w++]=i;
vis[i]=1;//这里只标记了加油站
}
}
}
t++;
}
for(i=1;i<=N;i++)
{
if(ok[i]&&!vis[i])//有加油站但是无法到达
return 0;
if(!ok[i]&&dis[i]*2>D)//没加油站但是到周围最短距离大于(D+1)/2
return 0; }
return 1;
}
int solve()
{
int i,j=N,k;
for(i=1;i<=N;i++)//最开始假设所有的点都建加油站
ok[i]=1;
if(!bfs())
{
puts("-1");
return 0;
}
for(i=N;i>0;i--)//从高到低能拆就拆
{
ok[i]=0;
if(!bfs())
ok[i]=1;
}
while(!ok[j])//除去前面的0
j--;
for(;j>0;j--)//这方法输出二进制还真是巧妙得很啊
printf("%d",ok[j]);
puts("");
}
int judge()//这个是我添加的一个判断是否有点到周围距离都大于D的,要不要对运行时间没影响
{
int i,j;
for(i=1;i<=N;i++)
dist[i]=inf;
for(i=1;i<=N;i++)
{
for(j=i+1;j<=N;j++)
{
if(dist[i]>e[i][j])
dist[i]=e[i][j];
if(dist[j]>e[i][j])
dist[j]=e[i][j];
}
if(dist[i]>D)
{
puts("-1");
return 0;
}
}
return 1;
}
int main()
{
int i,j,k,l;
while(scanf("%d%d",&N,&D)!=EOF)
{
for(i=1;i<=N;i++)
{
scanf("%d%d",&s[i].x,&s[i].y);
}
for(i=1;i<N;i++)
for(j=i;j<=N;j++)
e[j][i]=e[i][j]=clc(i,j);
if(!judge())
continue;
solve();
}
return 0;
}
hdu4435 charge-station(先建后拆+bfs)的更多相关文章
- 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)
Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...
- [HNOI2019]校园旅行(建图优化+bfs)
30分的O(m^2)做法应该比较容易想到:令f[i][j]表示i->j是否有解,然后把每个路径点数不超过2的有解状态(u,v)加入队列,然后弹出队列时,两点分别向两边搜索边,发现颜色一样时,再修 ...
- BZOJ-1066 蜥蜴 最大流+拆点+超级源超级汇
1066: [SCOI2007]蜥蜴 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2582 Solved: 1272 [Submit][Status] ...
- ural 1837. Isenbaev's Number bfs
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1837 描述: Isenbaev是国外的一个大牛. 现在有许多人要参加ACM ICPC. ...
- Codeforces Round #376 (Div. 2) C. Socks bfs
C. Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- POJ 1426 Find The Multiple --- BFS || DFS
POJ 1426 Find The Multiple 题意:给定一个整数n,求n的一个倍数,要求这个倍数只含0和1 参考博客:点我 解法一:普通的BFS(用G++能过但C++会超时) 从小到大搜索直至 ...
- [Swust OJ 85]--单向公路(BFS)
题目链接:http://acm.swust.edu.cn/problem/0085/ Time limit(ms): 5000 Memory limit(kb): 65535 Descriptio ...
- bzoj1656: [Usaco2006 Jan] The Grove 树木 (bfs+新姿势)
题目大意:一个n*m的图中,“.”可走,“X”不可走,“*”为起点,问从起点开始绕所有X一圈回到起点最少需要走多少步. 一开始看到这题,自己脑洞了下怎么写,应该是可过,然后跑去看了题解,又学会了一 ...
- BFS和队列
深度优先搜索(DFS)和广度优先搜索(BFS)是基本的暴力技术,常用于解决图.树的遍历问题. 首先考虑算法思路.以老鼠走迷宫为例: (1):一只老鼠走迷宫.它在每个路口都选择先走右边,直到碰壁无法继续 ...
随机推荐
- SQL Server 2008导入、导出数据库
SQL Server 2008数据库的导入.导出和Mysql的导出还有一定的区别,刚开始的时候完全摸不到方向,利用Microsoft SQL Server Management Studio进行导入. ...
- sublime text3输入中文的问题.
1.新建sublime_imfix.c文件 里面输入: /* * sublime-imfix.c * Use LD_PRELOAD to interpose some function to fix ...
- WildFly 9.0.2 启用 SSL
一.最近做个项目是需要在WildFly中启用https,但是由于WildFly的中文文档比较少所以google了一下,先是通过JBOSS的官方文档了解了一下,但是官方文档这块的配置介绍有些不全面.所以 ...
- JavaScript高级程序设计(二):在HTML中使用JavaScript
一.使用<script>元素 1.<script>元素定义了6个属性: async:可选.表示应该立即下载脚本,但不应该妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本 ...
- ios 相册相关
1.ALAssetsLibrary 系统中的资源库,可以使用他来访问资源库中的资源,照片.视屏等. [ALAssetsLibrary authorizationStatus];获取当前应用能否 ...
- 漫话JavaScript与异步·第一话——异步:何处惹尘埃
自JavaScript诞生之日起,频繁与异步打交道便是这门语言的使命,并为此衍生出了许多设计和理念.因此,深入理解异步的概念对于前端工程师来说极为重要. 什么是异步? 程序是分"块" ...
- 关于web开发的一点理解
对于web开发上的一点理解 1 宏观上的一点理解 网页从请求第地址 到获得页面的过程:从客户端(浏览器)通过地址 从soket把请求报文封装发往服务端 服务端通过解析报文并处理报文最后把处理的结果 ...
- open()函数
STDOUT_FILENO 1 标准输入 STDIN_FILENO 0 标准输出 STDERR_FILENO 2 标准错误 在/proc目 ...
- 网站开发常用jQuery插件总结(15)上传插件blueimp
在介绍这个插件之前,先吐槽一下.这个插件功能很强大.带有的功能有:上传(单个文件或批量文件),自动上传或点击按钮上传,上传前缩略图显示,判断文件格式,上传前的文件操作,上传时进度条显示等功能.如果你用 ...
- 根据日期自增的sql语句
Insert into wd_orderitem (count , id_dish , state , info , sn , id_order)values(1 , 1000000001 , 3 , ...