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):一只老鼠走迷宫.它在每个路口都选择先走右边,直到碰壁无法继续 ...
随机推荐
- java中substring和indexof() 和lastindexof()
java中substring和indexof() 和lastindexof() str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字 ...
- JBPM WEB CONSOLE安装实录
http://www.blogjava.net/paulwong/archive/2009/03/13/259551.html JBPM WEB CONSOLE是一个B/S端的,能管理JBPM的流程和 ...
- C# Mutex对象的使用
C# Mutex对象的使用 C#语言有很多值得学习的地方,这里我们主要介绍C# Mutex对象,包括介绍控制好多个线程相互之间的联系等方面. 如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要 ...
- C#垃圾回收机制详解
一.托管代码/非托管代码 C#代码通过C#编译器编译成程序集,程序集由微软中间语言组成,CLR会为程序集开辟一个应用程序域,程序集就是运行在这个应用程序域里面的,应用程序域是相互独立的,互不影响. 托 ...
- string应用
今天在网上搜了一些资料. C# string类应用 判断是否包含子串 想要判断一个字符串中是否包含某个子串,可以用Contains方法来实现: ? public bool Contains (stri ...
- jquery杂记之checkbox控制select置灰
jquery: $(function(){ $("#avg_day_live").bind("click",function(){ //点击 if($(&q ...
- OC加强-day05
#program mark - 0_11 NSRange结构体介绍 [掌握] 是Foundation框架中的一个结构体 NSRange 定义的一个变量的两个属性 location:起始下标 lengt ...
- Effective C++ 学习总结
摒弃C的做法采用C++的实现方式 以const和inline代替define 以iostream流代替stdio 以new和delete代替 C++风格注释 内存管理 new和delete, new[ ...
- 九度OJ 1433 FatMouse -- 贪心算法
题目地址:http://ac.jobdu.com/problem.php?pid=1433 题目描述: FatMouse prepared M pounds of cat food, ready to ...
- iframe框根据内容自适应高度
1.页面 <iframe name="iframe_userCenter" id="iframe" frameborder=2 width=100% he ...