PAT_1072 Gas Station
1072. Gas Station (30)
A gas station has to be built at such a location that the minimum distance between the station and any of the residential housing is as far away as possible. However it must guarantee that all the houses are in its service range.
Now given the map of the city and several candidate locations for the gas station, you are supposed to give the best recommendation. If there are more than one solution, output the one with the smallest average distance to all the houses. If such a solution is still not unique, output the one with the smallest index number.
Input Specification:
Each input file contains one test case. For each case, the first line contains 4 positive integers: N (<= 103), the total number of houses; M (<= 10), the total number of the candidate locations for the gas stations; K (<= 104), the number of roads connecting the houses and the gas stations; and DS, the maximum service range of the gas station. It is hence assumed that all the houses are numbered from 1 to N, and all the candidate locations are numbered from G1 to GM.
Then K lines follow, each describes a road in the format P1 P2 Dist where P1 and P2 are the two ends of a road which can be either house numbers or gas station numbers, and Dist is the integer length of the road.
Output Specification:
For each test case, print in the first line the index number of the best location. In the next line, print the minimum and the average distances between the solution and all the houses. The numbers in a line must be separated by a space and be accurate up to 1 decimal place. If the solution does not exist, simply output “No Solution”.
Sample Input 1:
4 3 11 5
1 2 2
1 4 2
1 G1 4
1 G2 3
2 3 2
2 G2 1
3 4 2
3 G3 2
4 G1 3
G2 G1 1
G3 G2 2
Sample Output 1:
G1
2.0 3.3
Sample Input 2:
2 1 2 10
1 G1 9
2 G1 20
Sample Output 2:
No Solution ==============================src====================================
dijikstra 方法计算图中 单源最短路径
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <math.h> using namespace std ; const int maxn = + + ;
struct HeapNode
{
int d , u ;
bool operator < ( const HeapNode &rhs) const
{
return d > rhs.d ;
}
} ; struct Edge
{
int from, to ,dist ;
} ; struct Dijkstra
{
int n , m ;
vector <Edge> edges ;
vector <int> G[maxn] ; bool done[maxn] ;
int d[maxn] ;
int p[maxn] ; void init ( int n )
{
int i ; this->n = n ;
for ( i = ; i < n ; i++ )
{
G[i].clear() ;
} edges.clear() ; } void AddEdge ( int from , int to , int dist )
{
Edge e ;
int m ; e.from = from ;
e.to = to ;
e.dist = dist ; edges.push_back(e) ; m = edges.size() ; G[from].push_back( m- ) ;
} void dijkstra ( int s )
{
priority_queue <HeapNode> Q ;
HeapNode node ; for ( int i = ; i < n ; i++ )
d[i] = maxn ; d[s] = ; memset(done , , sizeof(done) ) ; node.d = ;
node.u = s ; Q.push( (HeapNode) node) ; while( !Q.empty() )
{
node = Q.top () ;
Q.pop() ; int u = node.u ; if ( done[u] ) continue ; done[u] = true ; for ( int i = ; i < G[u].size() ; i++ )
{
Edge &e = edges[G[u][i]] ; if ( d[e.to] > (d[u] + e.dist) )
{
d[e.to] = d[u]+e.dist ;
p[e.to] = G[u][i] ; node.d = d[e.to] ;
node.u = e.to ;
Q.push(node) ; }
}
}
} } ; //set global vars
int N , M , K , Ds ;
Dijkstra Graph ; int charToInt (char *p )
{
int len ;
int sum = ;
int i ;
len = strlen(p) ; if (p[] == 'G')
{
for (i= ; i < len ; i++)
{
sum += (int)(p[i]-'')*(int)pow(,len-i- ) ;
}
sum += N ;
} else
{ for (i= ; i < len ; i++)
{
sum += (int)(p[i]-'')*(int)pow(,len-i- ) ;
}
}
return sum ;
} void Input()
{
int i ;
char line[][] ;
int x,y,v ; scanf("%d%d%d%d", &N,&M,&K,&Ds) ; Graph.init(N+M) ; for ( i = ; i < K ; i++ )
{
scanf("%s",line[]) ;
scanf("%s",line[]) ;
scanf("%s",line[]) ; x = charToInt(line[]) ;
y = charToInt(line[]) ;
v = charToInt(line[]) ; Graph.AddEdge(x- ,y- ,v ) ;
Graph.AddEdge(y- ,x- , v ) ;
} } int main ( void )
{
int i , j ; double min; bool flag = true ; double sum = ; Input() ; for ( i = N ; i < N+M ; i++ )
{
Graph.dijkstra( i ) ;
sum = ;
flag = true ;
min = maxn ; for ( j = ; j < N ; j++ )
{
if ( Graph.d [j] <= Ds )
{
sum += Graph.d[j] ;
if ( min > Graph.d[j] )
min = Graph.d[j] ;
}
else
{
flag = false ;
break ;
}
} if ( flag )
{
sum = sum/N ;
printf("G%d\n",i+-N) ;
printf("%.1f %.1f", min , sum) ; return ;
} } printf("No Solution") ; return ;
}
----------------------------another version----------------------------------------
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <math.h> using namespace std ; const int maxn = + + ;
struct HeapNode
{
int d , u ;
bool operator < ( const HeapNode &rhs) const
{
return d > rhs.d ;
}
} ; struct SolutionNode
{
double aver, min ;
int Gx ; bool operator < ( const SolutionNode &rhs) const
{ if ( aver > rhs.aver )
return true ;
else if ( aver == rhs.aver )
{
return Gx > rhs.aver ;
}
}
} ; struct Edge
{
int from, to ,dist ;
} ; struct Dijkstra
{
int n , m ;
vector <Edge> edges ;
vector <int> G[maxn] ; bool done[maxn] ;
int d[maxn] ;
int p[maxn] ; void init ( int n )
{
int i ; this->n = n ;
for ( i = ; i < n ; i++ )
{
G[i].clear() ;
} edges.clear() ; } void AddEdge ( int from , int to , int dist )
{
Edge e ;
int m ; e.from = from ;
e.to = to ;
e.dist = dist ; edges.push_back(e) ; m = edges.size() ; G[from].push_back( m- ) ;
} void dijkstra ( int s )
{
priority_queue <HeapNode> Q ;
HeapNode node ; for ( int i = ; i < n ; i++ )
d[i] = maxn ; d[s] = ; memset(done , , sizeof(done) ) ; node.d = ;
node.u = s ; Q.push( (HeapNode) node) ; while( !Q.empty() )
{
node = Q.top () ;
Q.pop() ; int u = node.u ; if ( done[u] ) continue ; done[u] = true ; for ( int i = ; i < G[u].size() ; i++ )
{
Edge &e = edges[G[u][i]] ; if ( d[e.to] > (d[u] + e.dist) )
{
d[e.to] = d[u]+e.dist ;
p[e.to] = G[u][i] ; node.d = d[e.to] ;
node.u = e.to ;
Q.push(node) ; }
}
}
} } ; //set global vars int N , M , K , Ds ;
Dijkstra Graph ; int charToInt (char *p )
{
int len ;
int sum = ;
int i ;
len = strlen(p) ; if (p[] == 'G')
{
for (i= ; i < len ; i++)
{
sum += (int)(p[i]-'')*(int)pow(,len-i- ) ;
}
sum += N ;
} else
{ for (i= ; i < len ; i++)
{
sum += (int)(p[i]-'')*(int)pow(,len-i- ) ; }
}
return sum ;
} void Input()
{
int i ;
char line[][] ;
int x,y,v ; scanf("%d%d%d%d", &N,&M,&K,&Ds) ; Graph.init(N+M) ; for ( i = ; i < K ; i++ )
{
scanf("%s",line[]) ;
scanf("%s",line[]) ;
scanf("%s",line[]) ; x = charToInt(line[]) ;
y = charToInt(line[]) ;
v = charToInt(line[]) ; Graph.AddEdge(x- ,y- ,v ) ;
Graph.AddEdge(y- ,x- , v ) ;
} } void Output()
{
int i , j ;
bool flag ;
priority_queue<SolutionNode> q ; for ( i = N ; i < N+M ; i++ )
{ Graph.dijkstra(i) ;
SolutionNode node ; node.aver= ;
node.min = maxn ;
node.Gx = i-N+;
flag = true ; for ( j = ; j < N ; j++ )
{
if ( Graph.d[j] <= Ds )
{
node.aver += Graph.d[j] ;
if ( node.min > Graph.d[j] )
node.min = Graph.d[j] ;
}
else
{
flag = false ;
break ;
}
} if ( flag )
{
node.aver = node.aver / N ; q.push(node) ; printf( "now q length :%d\n" , q.size() ) ;
} } if ( q.empty() )
{
printf("No Solution") ;
return ;
} else
{
SolutionNode node = q.top() ;
printf("G%d\n", node.Gx) ;
printf("%.1f %.1f", node.min , node.aver) ;
return ;
}
} int main ( void )
{ Input() ;
Output() ; return ; }
个人觉得这道题出的有一点问题,
从题中大意可知,
如果存在着 多个满足 解决方案的 Gx 点的话,
首先 要选取平均距离 为最小的 Gx , 可是从例子可以看出 G1 G2 中平均距离最小的应该是 G2,而并非是 G1。
或许是LZ理解的有误,先存档一下, 等有时间再通关。
PAT_1072 Gas Station的更多相关文章
- [LeetCode] Gas Station 加油站问题
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- PAT 1072. Gas Station (30)
A gas station has to be built at such a location that the minimum distance between the station and a ...
- Leetcode 134 Gas Station
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- 【leetcode】Gas Station
Gas Station There are N gas stations along a circular route, where the amount of gas at station i is ...
- [LeetCode] Gas Station
Recording my thought on the go might be fun when I check back later, so this kinda blog has no inten ...
- 20. Candy && Gas Station
Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- LeetCode——Gas Station
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- Gas Station
Description: There are N gas stations along a circular route, where the amount of gas at station i i ...
- Gas Station [LeetCode]
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
随机推荐
- HTTP分段下载
现代WEB服务器都支持大文件分段下载,加快下载速度,判断WEB服务器是否支持分段下载通过返回头是否有 Accept-Ranges: bytes 字段.分段下载分为两种,一种就是一次请求一个分段,一种就 ...
- 万科北京区域V-learn发布 系V-LINK产品系中首批产品
继今年4月发布了V-LINK万科社区服务商2.0升级版本后,万科北京区域再次迎来了品牌大动作.近日,北京万科正式发布“V-LINK”产品系中的首批产品“V-learn”相关战略. 全品类教育模式 据介 ...
- HDU-1700 Points on Cycle
这题的俩种方法都是看别人的代码,方法可以学习学习,要多看看.. 几何题用到向量.. Points on Cycle Time Limit: 1000/1000 MS (Java/Others) ...
- win7 64位 VS2010调试提示“ORA-12154: TNS: 无法解析指定的连接标识符”的解决方法
这个问题刚刚遇到,花了半小时,记录下 环境: vs2010[32位] oracle 10g[32位] 操作系统:windows 7 64位 解决步骤: 1.去网上下载“instantclient- ...
- Windows下使用GCC编译器
1.GCC编译器的选择 Windows下最常见的安装GCC的方式有两种:Cygwin和MinGW.本文主要介绍MinGW的安装配置. 2.下载MinGW 下载地址:http://sourceforge ...
- ORA-01653:表空间扩展失败的问题(开启表空间自动扩展)
----查询表空间使用情况---使用DBA权限登陆SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间 ...
- Delphi- 内置数据库的使用例子BDE
以前开发时经常使用一些大型的数据库,像这样小的数据库还是前段时间才看到.看看Delphi怎么使用内置的数据库, 先在BDE里拉两个数据库控件.DataBase和Table,然后再拉两个数据库控件Dat ...
- Xcode7 低版本iOS系统上下有黑边的问题
在使用Xcode7开发时,默认的启动页改成了 Launch Screen storyboard.通常情况下还是习惯使用 LaunchImage,介绍下Xcode7 下如何改为启动页是LaunchIma ...
- 动态获取jar文件的路径
下面专门封装了一个类来处理: import java.io.File; /** * 获取打包后jar的路径信息 * @author Administrator * 2011-01-16 13:53 ...
- iOS 使用CLGeocoder获取地理位置
placemark(MKPlacemark类的对象)其实是geocoder(MKReverseGeocoder类的对象)的一个属性.从geocoder里面取placemark这个和直接取placema ...