1072. Gas Station (30)

时间限制 
200 ms
内存限制 
32000 kB
代码长度限制 
16000 B
判题程序   
Standard
作者   
CHEN, Yue

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的更多相关文章

  1. [LeetCode] Gas Station 加油站问题

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  2. 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 ...

  3. 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 ...

  4. 【leetcode】Gas Station

    Gas Station There are N gas stations along a circular route, where the amount of gas at station i is ...

  5. [LeetCode] Gas Station

    Recording my thought on the go might be fun when I check back later, so this kinda blog has no inten ...

  6. 20. Candy && Gas Station

    Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  7. LeetCode——Gas Station

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  8. Gas Station

    Description: There are N gas stations along a circular route, where the amount of gas at station i i ...

  9. Gas Station [LeetCode]

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

随机推荐

  1. [King.yue]VS2012 无法启动IIS Express Web服务器的解决方案

    打开VS2012解决方案资源管理器 -> 点选 Web 项目选择 -> 属性 -> Web -> 选择“使用 Visual Studio 开发服务器” -> 选中“自动分 ...

  2. [NOIP2003]栈

    2003年普及组 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). 栈的重 ...

  3. oracle rac IP详解

    rac环境下vip/public/private IP的区别 每个节点要2块网卡, 3个IP,虚拟IP或者叫做业务IP,单个网卡当掉可以“漂”到其他网卡是继续提供服务 在Oracle RAC环境下,每 ...

  4. Apple LLVM 6.0 Warning: profile data may be out of date

    I have no clue what this meant, so I googled the problem. I only ended up with some search results s ...

  5. 使用 IntelliJ IDEA 导入 Spark 最新源码及编译 Spark 源代码

    前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. 准备工作 1.sca ...

  6. mysql常见优化,更多mysql,Redis,memcached等文章

    mysql常见优化 http://www.cnblogs.com/ggjucheng/archive/2012/11/07/2758058.html 更多mysql,Redis,memcached等文 ...

  7. hdoj 1012 u Calculate e

    u Calculate e Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. (贪心5.1.1)POJ 1230 Pass-Muraille

    /* * POJ_1230.cpp * * Created on: 2013年10月9日 * Author: Administrator */ #include <iostream> #i ...

  9. tensorflow 实现线性方程

    下面的直接是代码: #!usr/bin/env python#coding:utf-8"""这个代码的作用是 通过 tensorflow 来计算 y = 0.3x + 0 ...

  10. 为什么Form.Timer的event handler在Form被Dispose之后还是被调到了?

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:为什么Form.Timer的event handler在Form被Dispose之后还是被调到了?.