垃圾箱分佈
大家倒垃圾的時候,都希望垃圾箱距離自己比較近,但是誰都不願意守著垃圾箱住。所以垃圾箱的位置必須選在到所有居民點的最短距離最長的地方,同時還要保證每個居民點都在距離它一個不太遠的範圍內。
現給定一個居民區的地圖,以及若干垃圾箱的候選地點,請你推薦最合適的地點。如果解不唯一,則輸出到所有居民點的平均距離最短的那個解。如果這樣的解還是不唯一,則輸出編號最小的地點。
輸入格式:
輸入第一行給出4個正整數:N(≤103)是居民點的個數;M(≤10)是垃圾箱候選地點的個數;K(≤104 )是居民點和垃圾箱候選地點之間的道路條數;DS是居民點與垃圾箱之間不能超過的最大距離。所有的居民點從1到N編號,所有的垃圾箱候選地點從G1到GM編號。
隨後K行,每行按下列格式描述一條道路:
P1 P2 Dist
其中P1和P2是道路兩端點的編號,端點可以是居民點,也可以是垃圾箱候選點。Dist是道路的長度,是一個正整數。
輸出格式:
首先在第一行輸出最佳候選地點的編號。然後在第二行輸出該地點到所有居民點的最小距離和平均距離。數字間以空格分隔,保留小數點後1位。如果解不存在,則輸出No Solution。
輸入樣例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
輸出樣例1:
G1
2.0 3.3
輸入樣例2:
2 1 2 10
1 G1 9
2 G1 20
輸出樣例2:
No Solution
#include <bits/stdc++.h>
#include <string>
using namespace std;
const int maxv = 10000;
const int INF = 1e9;
int N, M, K, Ds;//N+M總點數,K邊數
int m = K, G[maxv][maxv];
int d[maxv];
bool vis[maxv];
struct Node{
int id;
double d_min;
double aver;
}ans[maxv];
bool cmp(Node a, Node b){
if(a.d_min != b.d_min){
return a.d_min > b.d_min;//最短距離最長
}else{
if(a.aver != b.aver) return a.aver < b.aver;
else return a.id < b.id;
}
}
void Dijkstra(int s){
fill(d, d+maxv, INF);
fill(vis, vis+maxv, 0);
d[s] = 0;
for(int i = 0; i <= N+M; i++){
int u = -1, Min = INF;
//找到最短路徑的下一點
for(int j = 1; j <= N+M; j++){
if(!vis[j] && d[j] < Min){
u = j;
Min = d[j];
}
}
if(u == -1) return;
vis[u] = true;
//更新d[]
for(int v = 1; v <= N+M; v++){
if(vis[v] == false && G[u][v] != INF && d[v] > d[u]+G[u][v]){
d[v] = d[u]+G[u][v];
}
}
}
}
int change(string s){
if(s[0] == 'G'){
s.erase(0,1);
int id = 0;
stringstream ss(s);
ss >> id;
return id+N;
}else{
int id = 0;
stringstream ss(s);
ss >> id;
return id;
}
}
int main(){
cin >> N >> M >> K >> Ds;
string str1, str2;
int w;
fill(G[0], G[0]+ maxv*maxv , INF);
for(int i = 0; i < K; i++){
cin >> str1 >> str2 >> w;
int id1 = change(str1);
int id2 = change(str2);
G[id1][id2] = w;
G[id2][id1] = w;
}
int cnt = 0;
for(int i = N+1; i <= N+M; i++){
Dijkstra(i);
bool flag = false;
int sum = 0,t_min = INF;
for(int j = 1; j <= N; j++){
sum += d[j];
t_min = min(t_min, d[j]);
if(d[j] > Ds){
flag = true;
break;
}
}
if(flag == false){
ans[cnt].id = i;
ans[cnt].d_min = t_min;
ans[cnt++].aver = sum*1.0/N;
//cout << i <<" "<< t_min << " "<<sum*1.0/N << endl;
}
}
if(cnt == 0){
cout << "No Solution" << endl;
}else{
sort(ans, ans+cnt,cmp);
stringstream a;
a << ans[0].id%N;
cout << "G" << a.str() << endl;
cout << fixed << setprecision(1) << ans[0].d_min+1e-8 <<" "<< ans[0].aver+1e-8 << endl;
}
return 0;
}
相關文章
- L3-005 垃圾箱分佈 (30分):最短路
- 特殊分佈律篇6——萊斯分佈
- 動態分佈與靜態分佈的區別
- 數理統計6:泊松分佈,泊松分佈與指數分佈的聯絡,離散分佈引數估計
- PRML 概率分佈概率分佈
- 概率演算法_二項分佈和泊松分佈演算法
- Python獲取好友地區分佈及好友性別分佈Python
- 概率論——常用分佈
- 多元統計分析04:多元正態分佈的抽樣分佈
- 位置分佈圖怎麼畫,怎麼做網點分佈圖
- 數理統計11:區間估計,t分佈,F分佈
- 卡方分佈和 Zipf 分佈模擬及 Seaborn 視覺化教程視覺化
- 正態分佈簡述
- Redis 實現分佈鎖Redis
- 熟悉常見概率分佈概率分佈
- 正態分佈的用法
- 位置分佈圖怎麼畫,怎麼做地圖網點分佈圖地圖
- 如何做公司區域分佈圖?怎麼畫網點分佈圖?
- 業務分佈地圖怎麼做,用地圖製作客戶分佈圖地圖
- 考研計算機408分值分佈計算機
- 十分鐘學習泊松分佈
- 玻爾茲曼能量分佈律及麥克斯韋速度分佈推導
- 區域分佈圖怎麼做,怎麼做區域網格分佈圖
- 怎麼理解伽馬分佈
- 常見的機率分佈
- 【scipy 基礎】--統計分佈
- 程式虛擬空間分佈
- 正態分佈函式值函式
- 如何通俗理解泊松分佈?
- 3分鐘tips:高斯分佈和高斯積分的關係
- 怎麼製作位置分佈圖?什麼軟體可以做區域分佈圖?
- 商場分佈圖是怎麼做,地圖資料分佈圖怎麼做地圖
- 怎麼製作區域分佈圖?區域網格分佈圖怎麼做?
- ML-樸素貝葉斯-先驗分佈/後驗分佈/似然估計
- 如何避免EDM營銷郵件進入使用者垃圾箱
- 正態分佈的應用——基於描述性統計與分佈的推論
- 地圖網點分佈圖怎麼做,如何製作地圖資料分佈圖地圖
- [Python輿情分析] 二.時間間隔分佈研究及冪律分佈圖繪製Python