您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ PAT