PAT上样例一是过不了的 会得出3.2 但是提交能全部通过23333
对各个垃圾箱(最多10个)使用Dij,因为会给出垃圾箱-垃圾箱的距离,所以垃圾箱和居民房在一个邻接矩阵里面,目测图挺大,故使用堆优化(很简单,加个priority_queue即可)。
#include <bits/stdc++.h>
using namespace std;
int housen, gabn, maxlen, roadn;
int table[1050][1050];
int getid(char * str){
if(*str == 'G') return atoi(str + 1) + housen - 1;
else return atoi(str) - 1;
}
struct node{
int point;
int dis;
node(int a, int b){
point = a;
dis = b;
}
};
struct cmp{
bool operator ()(node a, node b){
return a.dis > b.dis;
}
};
int main(){
scanf("%d %d %d %d", &housen, &gabn, &roadn, &maxlen);
memset(table, 0x3f, 1050 * 4200);
char str1[10], str2[10];
int templen;
for(int i = 0; i < roadn; ++i){
scanf("%s %s %d", str1, str2, &templen);
int p1 = getid(str1), p2 = getid(str2);
table[p1][p2] = table[p2][p1] = templen;
}
int ans = -1;
int sum = 0x3f3f3f3f;
int min_ = -1;
int dis[1050], vis[1050];
for(int g = housen; g < gabn + housen; ++g){
memset(dis, 0x3f, 4200);
memset(vis, 0, 4200);
dis[g] = 0;
priority_queue<node, vector<node>, cmp> pq;
pq.push(node(g, 0));
while(!pq.empty()){
node temp = pq.top();
pq.pop();
if(vis[temp.point]) continue;
vis[temp.point] = -1;
for(int i = 0; i < gabn + housen; ++i){
if(!vis[i] && (dis[i] > dis[temp.point] + table[i][temp.point])){
dis[i] = dis[temp.point] + table[i][temp.point];
pq.push(node(i, dis[i]));
}
}
}
int flag = 1;
int tempsum = 0, tempmin = 0x3f3f3f3f;
for(int i = 0; i < housen; ++i){
if(maxlen < dis[i]){
flag = 0;
break;
}
tempsum += dis[i];
tempmin = min(tempmin, dis[i]);
}
if(flag && (tempmin > min_ || (tempmin == min_ && tempsum < sum))){
sum = tempsum;
min_ = tempmin;
ans = g - housen + 1;
}
}
if(ans == -1) printf("No Solution");
else printf("G%d\n%.1f %.1f", ans, (double)min_, (double)sum / housen);
}