description
小t打算在城市c開設一家外送快餐店。送餐到某乙個地點的時間與外賣店到該地點之間最短路徑長度是成正比的,小t希望快餐店的位址選在離最遠的顧客距離最近的地方。 快餐店的顧客分布在城市c的n 個建築中,這n 個建築通過恰好n 條雙向道路連線起來,不存在任何兩條道路連線了相同的兩個建築。任意兩個建築之間至少存在一條由雙向道路連線而成的路徑。小t的快餐店可以開設在任一建築中,也可以開設在任意一條道路的某個位置上(該位置與道路兩端的建築的距離不一定是整數)。 現給定城市c的地圖(道路分布及其長度),請找出最佳的快餐店選址,輸出其與最遠的顧客之間的距離。
input
第一行包含乙個整數n,表示城市c中的建築和道路數目。
接下來n行,每行3個整數,ai,bi,li(1≤i≤n;li>0),表示一條道路連線了建築ai與bi,其長度為li 。
output
僅包含乙個實數,四捨五入保留恰好一位小數,表示最佳快餐店選址距離最遠使用者的距離。
注意:你的結果必須恰好有一位小數,小數字數不正確不得分。
sample input
1 2 1sample output1 4 2
1 3 2
2 4 1
2.0hint
資料範圍
對於 10%的資料,n<=80,li=1;
對於 30%的資料,n<=600,li<=100;
對於 60% 的資料,n<=2000,li<=10^9;
對於 100% 的資料,n<=10^5,li<=10^9
分析:首先,答案一定是環上去掉一條邊後剩下樹的「直徑」的一半,於是我們列舉刪邊,然後用維護線段樹來求過環上邊的最長路徑,**寫的巨醜。
#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f
#define eps 1e-9
#define mod 1000000007
#define max 100000047483647ll
#define n 100005
using namespace std;
typedef long long ll;
typedef pairpii;
ll ans,cir_len,maxval,pre,mans[n][2];
int n,u,v,val,jud[n],vis[n];
map f;
vector g[n];
stack s;
vectora;
struct tree
tree[2][4*n];
bool circle(int u,int fa)
a.push_back(v);
s.pop();
return true;
}else
if(circle(v,u)) return true;
} s.pop();
return false;
} void up_date(int u,pii edge)
void dfs(int u,int fa)
} maxval = max(maxval,mans[u][0] + mans[u][1]);
}void down(int op,int i)
}void up(int op,int i)
}void deal(int op,int i,int l,int r,int x,int y,ll val)
down(op,i);
int mid = (l + r) >> 1;
if(y <= mid) deal(op,2*i,l,mid,x,y,val);
else
if(x <= mid)
else deal(op,2*i+1,mid+1,r,x,y,val);
up(op,i);
}void up_date(ll &ans)
}int main()
circle(1,-1);
for(int i = 0;i < a.size();i++)
for(int i = 0;i < a.size();i++)
for(int i = 0;i < a.size();i++)
ans = max;
up_date(ans);
for(int i = 0;i < a.size()-1;i++)
printf("%.1lf\n",ans*0.5);
}
NOI2013 快餐店 環套樹 線段樹
題目大意 給你一顆環套樹,你要在這棵的邊上 包括端點 找乙個點,使得離該點最遠的點最近。資料範圍 n 10 5 邊權 10 9 此題不難看出一種暴力做法,我們依次斷開環上的一條邊,然後求整顆樹的直徑,取個 min 就好了,時間複雜度是 o n 2 的。然而顯然會 t 我們考慮一些優秀的做法,我們首先...
樹DP 基環樹 NOI2013 快餐店
小 t 打算在城市 c 開設一家外送快餐店。送餐到某乙個地點的時間與外賣店到該地點之間最短路徑長度是成正比的,小 t 希望快餐店的位址選在離最遠的顧客距離最近的地方。快餐店的顧客分布在城市 c 的 n 個建築中,這 n個建築通過恰好 n 條雙向道路連線起來,不存在任何兩條道路連線了相同的兩個建築。任...
UOJ126 NOI2013 快餐店(基環樹dp)
題目鏈結 思路 現在圖中保證一定只有乙個環,這個基環樹,也就是說去掉環上的任意一條邊,它能形成一棵樹,先看最長路徑不在環上的情況,那麼最長路徑就是在環上的點為根的子樹中了,這個求下樹的直徑即可。看在環上的,如果最長路徑在環上,最長路徑一定有一條環上的邊沒有經過,假設 u v u,v 是沒有經過地邊,...