1072. Gas Station (30)

来源:互联网 发布:怎么清理mac磁盘 编辑:程序博客网 时间:2024/05/13 05:53
#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>#include <vector>using namespace std;#define N 1010struct road {int next;int dist;road(int d1, int d2) : next(d1), dist(d2) {}};inline int uid(char str[], int n, int m) {if(str[0] == 'G')return atoi(str+1) - 1;elsereturn atoi(str) - 1 + m;}void check(int src, int n, int m, vector<road> adj[], int md, int &station, int &fmd, double &ad) {bool done[N] = {};int dist[N] = {};bool qualified = true;done[src] = true;int node = src;int hc = 0;while(true) {for(int i = 0; i < adj[node].size(); i ++) {road r =  adj[node][i];if(!done[r.next]) {int tmpd = dist[node] + r.dist;if(!dist[r.next] || tmpd < dist[r.next])dist[r.next] = tmpd;}}int mind = 0x7fffffff;for(int i = 0; i < n+m; i ++) {if(!done[i] && dist[i] && dist[i] < mind) {node = i;mind = dist[i];}}if(node >= m && dist[node] > md) {qualified = false;break;}if(mind == 0x7fffffff)break;done[node] = true;}if(qualified) {int mind = 0x7fffffff; int td = 0;for(int i = m; i < m+n; i ++) {if(!done[i]) {qualified = false;break;}else {if(dist[i] < mind)mind = dist[i];td += dist[i];}}double tmpad = 1.0*td/n;if(qualified && (mind > fmd || (mind == fmd && tmpad < ad))) {station = src;fmd = mind;ad = tmpad;}}}int main(int argc, char **argv) {int n, m, k, md;cin >> n >> m >> k >> md;vector<road> adj[N];for(int i = 0; i < k; i ++) {char str1[10], str2[10];int dist;scanf("%s%s%d", str1, str2, &dist);int s1 = uid(str1, n, m), s2 = uid(str2, n, m);adj[s1].push_back(road(s2, dist));adj[s2].push_back(road(s1, dist));}int station = -1, fmd = -1;double ad;for(int i = 0; i < m; i ++) {check(i, n, m, adj, md, station, fmd, ad);}if(station >= 0) {printf("G%d\n%d.0 %.1lf\n", station+1, fmd, ad);}else {printf("No Solution\n");}return 0;} 

0 0
原创粉丝点击