2017CCPC中南地區賽 H題
題目地址:202.197.224.59/OnlineJudge2/
來自湘潭大學OJ,題號:1267。
這裡用到了一個樹的直徑(樹中的最長邊)的結論:當你找到一棵樹的最長邊後,這個樹中所有點的最長邊必定和這條邊的兩個端點相連。下面給出證明:
設這條最長邊的兩個端點分別為B和E;
1.當選擇的任意點M在這條最長邊上時:如果此時還存在另一個點T,使得MT > max{MB,ME}。則:MT + min{MB,ME} > max{MB,ME} + min{MB,ME} = BE這與題目假設相矛盾。
2.當選擇的任意點M不在這條最長邊上時:
Α.與它相連的最長邊與BE有交點時,假設交於X,則:M的最長邊 = MX + X的最長邊,而X在BE上,所以M的最長邊 = MX + max{XB,XE}即它的最長邊終止於BE中的一個點。
B.若無交點,假設M的最長邊為MN,則:取BE上一點X,連接MX,有:MN > max{XB,XE} + XM,MN + MX + max{XB,XE} > 2MX + 2max{XB,XE} > BE與題設矛盾
由此,本題思路即為:先找到最長邊,然後將其餘的n - 2個點到最長邊兩個端點的距離算出,不斷地挑選這n-2個點到兩個端點的更長的那個路徑,最後加上這條最長路就是所求結果。
下面的代碼用C++11提交能過,而用G++則會WA
#include
#include
#include
#include
#include
#include
#define maxn 100005
#define F 0x3f
using namespace std;
struct edge
{
int len,over;
edge(int a = 0,int b = 0)
{
len = a,over = b;
}
};
long long dist[3][maxn];
vector
inline void init
{
for(int i = 1;i < maxn;++i)
graph[i].clear;
}
queue
void bfs(int use,int start)
{
while(q.size) q.pop;
q.push(start);
dist[use][start] = 0;
while(q.size){
int temp = q.front;
q.pop;
for(int i = 0;i < graph[temp].size;++i){
int length = graph[temp][i].len,nextone = graph[temp][i].over;
if(dist[use][nextone] == -1){
dist[use][nextone] = dist[use][temp] + length;
q.push(nextone);
}
}
}
return;
}
int main
{
int n;
while(scanf("%d",&n) == 1){
int start,over,len;
init;
for(int i = 0;i < n - 1;++i){
scanf("%d%d%d",&start,&over,&len);
graph[start].push_back(edge(len,over));
graph[over].push_back(edge(len,start));
}
int point1,point2;
memset(dist,-1,sizeof(dist));
//printf("now dist is %lld
",dist[0][0]);
bfs(0,1);
long long maxone = 0;
for(int i = 2;i <= n;++i){
if(dist[0][i] > maxone) maxone = dist[0][i],point1 = i;
}
maxone = 0;
bfs(1,point1);
for(int i = 1;i <= n;++i){
if(dist[1][i] > maxone) maxone = dist[1][i],point2 = i;
}
bfs(2,point2);
//printf("point1 is %d and point2 is %d
",point1,point2);
long long answer = 0;
answer += dist[1][point2];
for(int i = 1;i <= n;++i){
if(i != point1 && i != point2){
answer += max(dist[1][i],dist[2][i]);
}
}
if(n == 1) answer = 0;
printf("%lld
",answer);
}
return 0;
}
※你猜這個題輸出啥?——java基礎概念
※C基礎:.NET環境下WebConfig的加密
※從 JavaScript 到 TypeScript
※簡單RPC框架-業務線程池
TAG:達人科技 |
※THOM BROWNE 中港台地區限定 TBX909 與 TBX910 新色上架
※IDC:2018年亞洲地區(除日本外)VR/AR支出將達111億美元 中國佔九成
※IDC:2019年亞太地區AR/VR總支出將達75億美元
※HTC在台灣地區發布2款新機 HTC U19e 和 HTC Desire 19+
※江淮iEV7S北京地區上市 售價20.71萬元
※LG V40 ThinQ將在台灣地區上市:搭載驍龍845 售價5500元
※OPPO Find X登陸台灣地區:標準版近6000元
※2019年第63屆中國地區TOPIK報名方法圖解
※銘瑄推GTX 1050 3GB版本:中國地區獨佔
※提前發售!OW x AJ1 「UNC」 部分地區5月30日上架!
※2019年1月北京地區 蜜顏醫美大數據TOP10榜單
※2018年4月北京地區 蜜顏醫美大數據TOP10榜單
※2019年2月北京地區 蜜顏醫美大數據TOP10榜單
※2018年3月北京地區 蜜顏醫美大數據TOP10榜單
※2018年1月北京地區 蜜顏醫美大數據TOP10榜單
※2018年6月北京地區 蜜顏醫美大數據TOP10榜單
※2018中國地區最佳PC遊戲排行榜
※2018年5月北京地區 蜜顏醫美大數據TOP10榜單
※日本地區PS4版《夢幻之星Online 2》下載量達100萬
※「慣性」下周歸來,YEEZY 700 V2 「INERTIA」全球41地區即將上線!