hdu4514 湫湫系列故事 設計風景線

2021-06-18 06:44:46 字數 1705 閱讀 8346

求樹的最長直徑,之前做過hdu2196,套用那道題的思路,兩次dfs,求出每個結點的最長直徑,然後找出最大的即為整棵樹的最長直徑

#pragma comment(linker, "/stack:102400000,102400000")

#include#include#include#define m 100010

#define me 1000010

using namespace std;

struct nodeedge[me*2];

int head[m];

int tot;

int n,m;

int len[m],len2[m],lenid[m];

bool vis[m];

int ans;

void insert(int u,int v,int val)

bool dfs(int u,int pre)

return false;

}void dfs1(int u,int pre)

else if(len[v]+edge[i].val>len2[u])

}}void dfs2(int u,int pre)

else if(len2[u]+edge[i].val>len2[v])

}else

else if(len[u]+edge[i].val>len2[v])

}dfs2(v,u);

ans=max(ans,len[v]);

}}int main()

for(i=1;i<=n;i++)

if(!vis[i])

if(dfs(i,-1))

break;

if(i<=n)

printf("yes\n");

else

printf("%d\n",ans);}}

return 0;

}

還有一種更合適的方法,一次dfs即可求出一棵樹的最長直徑,len[i]表示以i為根結點的樹的最長直徑,len2[i]表示以i為根結點的樹且以i為起點的最長直徑
#pragma comment(linker, "/stack:102400000,102400000")

#include#include#include#define m 100010

#define me 1000010

using namespace std;

struct nodeedge[me*2];

int head[m];

int tot;

int n,m;

int len[m],len2[m];

bool vis[m];

int ans;

void insert(int u,int v,int val)

bool dfs(int u,int pre)

return true;

}void dfs1(int u,int pre)

if(len[u]>ans)

ans=len[u];

}int main()

for(i=1;i<=n;i++)

if(!vis[i])

if(!dfs(i,-1))

break;

if(i<=n)

printf("yes\n");

else

}return 0;

}

HDU 4514 湫湫系列故事 設計風景線

description 隨著杭州西湖的知名度的進一步提公升,園林規劃專家湫湫希望設計出一條新的經典觀光線路,根據老闆馬小騰的指示,新的風景線最好能建成環形,如果沒有條件建成環形,那就建的越長越好。現在已經勘探確定了n個位置可以用來建設,在它們之間也勘探確定了m條可以設計的路線以及他們的長度。請問是否...

湫湫系列故事 設計風景線

湫湫系列故事 設計風景線 time limit 3000ms memory limit 32768kb 64bit io format i64d i64u submit status practice hdu 4514 description 隨著杭州西湖的知名度的進一步提公升,園林規劃專家湫湫希望...

HDU4544 湫湫系列故事 消滅兔子

hdu 4544 tags 資料結構,貪心 analysis 將兔子的血量從大到小排序,將箭的殺傷力從大到小排序,對於每乙個兔子血量,將比他大的殺傷力大的劍壓入優先佇列,優先佇列自己重寫,讓它每次丟擲的數為價錢最小。code include include include include using...