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 ...
随机推荐
- BZOJ 2588: Spoj 10628. Count on a tree 主席树+lca
分析:树上第k小,然后我想说的是主席树并不局限于线性表 详细分析请看http://www.cnblogs.com/rausen/p/4006116.html,讲的很好, 然后因为这个熟悉了主席树,真是 ...
- eclipse中 将java项目转换为web项目 博客分类: Tomcat
1.找到项目工作空间目录,打开.project文件,并修改文件, 修改如下: 找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: ...
- codeforce 621C Wet Shark and Flowers
题意:输入个n和质数p,n个区间,每个区间可以等概率的任选一个数,如果选的这个区间和它下个区间选的数的积是p的倍数的话(n的下个是1),就挣2000,问挣的期望 思路:整体的期望可以分成每对之间的期望 ...
- HW4.6
public class Solution { public static void main(String[] args) { final double MILES_PER_KILOGRAM = 1 ...
- ural 1748 The Most Complex Number 和 丑数
题目:http://acm.timus.ru/problem.aspx?space=1&num=1748 题意:求n范围内约数个数最多的那个数. Roughly speaking, for a ...
- Java 线程池架构原理和源码解析(ThreadPoolExecutor)
在前面介绍JUC的文章中,提到了关于线程池Execotors的创建介绍,在文章:<java之JUC系列-外部Tools>中第一部分有详细的说明,请参阅: 文章中其实说明了外部的使用方式,但 ...
- 如何查看tomcat是32位还是64位
原文地址:http://www.cnblogs.com/andysd/p/3940976.html
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- linux命令之cat
转自:http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容, ...
- KVC 和KVO浅谈
一.KVC:Key-Value -Coding :直译为:键-值-代码:即:对键值进行改变的代码方法 该方法是OC(Object-C)为我们提供的一个不通过初始化方法而直接改变对象实例变量值的一种 ...