1072. Gas Station (30)
2016-02-27 21:24
399 查看
Dijkstra计算单源出发到任意一点的最短路径,该处要找出所有加油站中离居民房的最小值最大的,故从所有的加油站出发均做一次 dijkstra 查找,然后进行后续操作。
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define INF (~(1<<31))
int n, m, k, ds;
vector<vector<int>> graph;
vector<int> dist;
struct Station{
int num, mindist, total;
Station(int n, int m, int t) : num(n), mindist(m), total(t){}
bool operator < (const Station& rhs) const{
if(mindist != rhs.mindist) return mindist > rhs.mindist;
else if(total != rhs.total) return total < rhs.total;
else return num < rhs.num;
}
};
void dijkstra(int src){
// initialize dist[]
for(int i = 1; i <= n+m; ++i){
dist[i] = graph[src][i] == -1 ? INF : graph[src][i];
}
vector<bool> used(n+m+1, false);
int cur = src;
dist[src] = 0;
for(int i = 0; i < n+m-1; ++i){
int mindist = INF, next;
used[cur] = true;
for(int j = 1; j <= n+m; ++j){
if(used[j]) continue;
if(graph[cur][j] != -1){
int v = dist[cur] + graph[cur][j];
if(v < dist[j]){
dist[j] = v;
}
}
if(mindist > dist[j]){
mindist = dist[j];
next = j;
}
}
cur = next;
}
}
int str2index(char p[]){
if(p[0] == 'G') return n+atoi(p+1);
else return atoi(p);
}
int main(){
scanf("%d%d%d%d", &n, &m, &k, &ds);
graph.resize(n+m+1, vector<int>(n+m+1, -1));
dist.resize(n+m+1, INF);
for(int i = 0; i < k; ++i){
char p1[5], p2[5];
int dist;
scanf("%s%s%d", p1, p2, &dist);
int x = str2index(p1), y = str2index(p2);
graph[x][y] = dist;
graph[y][x] = dist;
}
vector<Station> gas;
for(int i = n+1; i <= n+m; ++i){
dijkstra(i);
int mindist = INF;
int total = 0;
bool bad = false;
for(int j = 1; j <= n; ++j){
if(dist[j] > ds){
bad = true;
break;
}else{
total += dist[j];
mindist = min(mindist, dist[j]);
}
}
if(!bad){
gas.emplace_back(i, mindist, total);
}
}
if(gas.empty()){
printf("No Solution");
}else{
sort(begin(gas), end(gas));
printf("G%d\n", gas[0].num - n);
printf("%.1f %.1f", (float)gas[0].mindist, (float)gas[0].total/n);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define INF (~(1<<31))
int n, m, k, ds;
vector<vector<int>> graph;
vector<int> dist;
struct Station{
int num, mindist, total;
Station(int n, int m, int t) : num(n), mindist(m), total(t){}
bool operator < (const Station& rhs) const{
if(mindist != rhs.mindist) return mindist > rhs.mindist;
else if(total != rhs.total) return total < rhs.total;
else return num < rhs.num;
}
};
void dijkstra(int src){
// initialize dist[]
for(int i = 1; i <= n+m; ++i){
dist[i] = graph[src][i] == -1 ? INF : graph[src][i];
}
vector<bool> used(n+m+1, false);
int cur = src;
dist[src] = 0;
for(int i = 0; i < n+m-1; ++i){
int mindist = INF, next;
used[cur] = true;
for(int j = 1; j <= n+m; ++j){
if(used[j]) continue;
if(graph[cur][j] != -1){
int v = dist[cur] + graph[cur][j];
if(v < dist[j]){
dist[j] = v;
}
}
if(mindist > dist[j]){
mindist = dist[j];
next = j;
}
}
cur = next;
}
}
int str2index(char p[]){
if(p[0] == 'G') return n+atoi(p+1);
else return atoi(p);
}
int main(){
scanf("%d%d%d%d", &n, &m, &k, &ds);
graph.resize(n+m+1, vector<int>(n+m+1, -1));
dist.resize(n+m+1, INF);
for(int i = 0; i < k; ++i){
char p1[5], p2[5];
int dist;
scanf("%s%s%d", p1, p2, &dist);
int x = str2index(p1), y = str2index(p2);
graph[x][y] = dist;
graph[y][x] = dist;
}
vector<Station> gas;
for(int i = n+1; i <= n+m; ++i){
dijkstra(i);
int mindist = INF;
int total = 0;
bool bad = false;
for(int j = 1; j <= n; ++j){
if(dist[j] > ds){
bad = true;
break;
}else{
total += dist[j];
mindist = min(mindist, dist[j]);
}
}
if(!bad){
gas.emplace_back(i, mindist, total);
}
}
if(gas.empty()){
printf("No Solution");
}else{
sort(begin(gas), end(gas));
printf("G%d\n", gas[0].num - n);
printf("%.1f %.1f", (float)gas[0].mindist, (float)gas[0].total/n);
}
return 0;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- 解析C++中派生的概念以及派生类成员的访问属性