L3-005 垃圾箱分佈 (30分):最短路
大家倒垃圾的時候,都希望垃圾箱距離自己比較近,但是誰都不願意守著垃圾箱住。所以垃圾箱的位置必須選在到所有居民點的最短距離最長的地方,同時還要保證每個居民點都在距離它一個不太遠的範圍內。
現給定一個居民區的地圖,以及若干垃圾箱的候選地點,請你推薦最合適的地點。如果解不唯一,則輸出到所有居民點的平均距離最短的那個解。如果這樣的解還是不唯一,則輸出編號最小的地點。
輸入格式:
輸入第一行給出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
即使不放垃圾箱,那一點也能走。不用四捨五入
//臥槽,最後一個測試樣例一直過不去,結果把+0.05去掉就過了,它第一個樣例有毒吧
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int g[1100][1100],dis[10010],b[10010],n,m,k,ds,ans=0,u,v,t,l=0;
double tt,av;
string s;
int ge(int l,int r)
{
int tt=0;
for(int i=l;i<=r;i++)
tt=tt*10+s[i]-'0';
return tt;
}
void sear(int x)
{
int tip=n+m;
for(int i=1;i<=tip;i++)
{
b[i]=0;
if(g[x][i]) dis[i]=g[x][i];
else dis[i]=0x3f3f3f3f;
}
b[x]=1;dis[x]=0;
while(1)
{
tt=0x3f3f3f3f;
for(int i=1;i<=tip;i++)
if(b[i]==0&&dis[i]<tt)
{
tt=dis[i];t=i;
}
if(tt==0x3f3f3f3f) break;
b[t]=1;
for(int i=1;i<=tip;i++)
if(b[i]==0&&g[t][i])
dis[i]=min(dis[i],dis[t]+g[t][i]);
}
tt=0;t=0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(dis[i]>ds) return;
if(dis[i]<t) t=dis[i];
tt+=dis[i];
}
if(t>l||(t==l&&tt<av)) ans=x,l=t,av=tt;
}
int main()
{
ios::sync_with_stdio(false);
memset(g,0x3f3f3f3f,sizeof(g));
cin>>n>>m>>k>>ds;
while(k--)
{
cin>>s;
u=0;v=0;
if(s[0]!='G') u=ge(0,s.length()-1);
else u=ge(1,s.length()-1)+n;
cin>>s;
if(s[0]!='G') v=ge(0,s.length()-1);
else v=ge(1,s.length()-1)+n;
cin>>t;
g[u][v]=min(g[u][v],t);
g[v][u]=min(g[v][u],t);
}
for(int i=1;i<=m;i++)
sear(i+n);
if(ans) cout<<'G'<<ans-n<<endl<<fixed<<setprecision(1)<<(l*1.0)<<" "<<fixed<<setprecision(1)<<av/n;
else cout<<"No Solution";
return 0;
}
相關文章
- 垃圾箱分佈
- 最短路:求最長最短路
- 最短路 || 最長路 || 次短路
- 分層圖最短路
- 分層圖求最短路
- 《復聯4》城市票房分佈 北京平均票價最貴
- 特殊分佈律篇6——萊斯分佈
- 7-1 最短路徑之Dijkstra (10分)
- POJ3159 Candies【差分約束+最短路】
- 動態分佈與靜態分佈的區別
- 數理統計6:泊松分佈,泊松分佈與指數分佈的聯絡,離散分佈引數估計
- PRML 概率分佈概率分佈
- 概率演算法_二項分佈和泊松分佈演算法
- Python獲取好友地區分佈及好友性別分佈Python
- 概率論——常用分佈
- 多元統計分析04:多元正態分佈的抽樣分佈
- 位置分佈圖怎麼畫,怎麼做網點分佈圖
- 數理統計11:區間估計,t分佈,F分佈
- 卡方分佈和 Zipf 分佈模擬及 Seaborn 視覺化教程視覺化
- 1062 最簡分數
- 最短路
- 次短路
- 一分鐘搞懂邏輯運算子&(並且) , |(或者) , !(非) , ^(異或) , &&(短路與) , ||(短路或)之間的關係
- 正態分佈簡述
- Redis 實現分佈鎖Redis
- 熟悉常見概率分佈概率分佈
- 正態分佈的用法
- 最大值(最短路+最短路計數)
- 位置分佈圖怎麼畫,怎麼做地圖網點分佈圖地圖
- 如何做公司區域分佈圖?怎麼畫網點分佈圖?
- 業務分佈地圖怎麼做,用地圖製作客戶分佈圖地圖
- 考研計算機408分值分佈計算機
- 十分鐘學習泊松分佈
- CF79D Password (差分+狀壓 dp+最短路/bfs)
- 自然語言處理工具HanLP-N最短路徑分詞自然語言處理HanLP分詞
- BZOJ2763: [JLOI2011]飛行路線(分層圖 最短路)
- L2-001 緊急救援 (25分)【新增陣列求最短路數量】【pre陣列記錄最短路徑】陣列
- Flexbox 佈局的最簡單表單Flex