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):一只老鼠走迷宫.它在每个路口都选择先走右边,直到碰壁无法继续 ...
随机推荐
- 有关IT的小笑话
路上看到一个女孩朝我走来:“请问你是不是学计算机的?”我疑惑的点点头,她兴奋的又问:“那你有女朋友吗?”我兴奋的摇头:“没有啊,是不是你家电脑坏了?”她转身对后面的女孩说:“看吧,我就知道这种背双肩包 ...
- Virtual Studio C++ Version Macro - _MSC_VER
MSVC++ (Visual Studio ) MSVC++ (Visual Studio ) MSVC++ (Visual Studio ) MSVC++ (Visual Studio ) MSVC ...
- ios ReactiveViewModel
项目中使用 ReactiveCocoa 一般都会嵌入ReactiveViewModel 或者 ReactiveCocoaLayout 联合处理UI.网络.动画.布局.窗口切换等,组合使用时威力惊人. ...
- bootstrap 正则表达式
<asp:TextBox runat="server" title="邮箱正确格式:xxx@xxx.xxx" class="form-cont ...
- 《ext江湖》第8章继承-代码片段
创建Animal对象 <html> <head> <title>11</title> <META HTTP-EQUIV="Content ...
- Android MVP模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
- ASP.NET中Json的处理
要使用.NET自带的JSON处理工具需要引用下面的命名空间: using System.Web.Script.Serialization; 1.编码 myConfig mc = new myConfi ...
- ASP.NET获取上传图片的大小
1.采用客户端javascript可以取得图片大小 <input id="FileUpload" type="file" size="30&qu ...
- PHP类中的__get()和__set函数到底有什么用?
当试图获取一个不可达变量时,类会自动调用__get. 同样的,当试图设置一个不可达变量时,类会自动调用__set. 在网站中,这两个并不是什么非用不可的函数. 例如: Class Test { ...
- javascript 节点属性详解
javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...