Hdu 2196 - Computer
生活随笔
收集整理的這篇文章主要介紹了
Hdu 2196 - Computer
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
即求樹上每點的最長路,先求出樹的直徑上的一點(dfs、bfs均可,尋找第一點我用的bfs),然后再從這點搜出樹直徑的另一點。可以證明每點的最長路是到這兩點的距離之一(因為樹是連通的,因為是樹的直徑,如果某點s到直徑某點t的距離小于到另一點u的距離,那么u就可以代替t成為樹的直徑了。
本題惡心的是內存限制,一開始采用邊表老是超內存,后來把數組改為short后還不行,根據樹的性質(E=V-1)使用數組鏈表,結果length可以超過short又忘了把short改為int就徹底悲劇了。。T^T
#include <stdio.h> #include <string.h>#define _END 0x4f4f int pass[20005], head[10005]; int v[20010], dis[20010], xdis; int dp0[10005], dp1[16384], *dp; int f, r;void dfs(int n) {int i, j;if (dp[n] > dp[xdis]) xdis = n;for(i=head[n]; i<_END; i = pass[i]) {if (dp[j = v[i]] == -1) {dp[j] = dp[n] + dis[i];dfs(j);}} }#define max(a,b) ((a)>(b) ? (a) : (b))int main(void) {int N;while(scanf("%d", &N) > 0) {int i, j, k;i = 0;memset(head, _END, sizeof(head));for(j=1; j<N; ++j) {int l;scanf("%d%d", &k, &l); --k;pass[i] = head[j], v[i] = k, dis[i] = l; head[j] = i++;pass[i] = head[k], v[i] = j, dis[i] = l; head[k] = i++;}memset(dp = dp0, -1, sizeof(int) * N);int mx;#define q dp1mx = dp[0] = q[f = 0] = 0, r = 1;while(f != r) {j = q[f];if (dp[j] > dp[mx]) mx = j;int l;for(k=head[j]; k<_END; k = pass[k]) {l = v[k];if (dp[l] == -1) {dp[q[r] = l] = dp[j] + dis[k];r = (r+1) & 16383;}}f = (f+1) & 16383;}#undef qmemset(dp, -1, sizeof(int) * N);dp[mx] = 0; dfs(xdis = mx);memset(dp = dp1, -1, sizeof(int) * N);dp[xdis] = 0; dfs(xdis);for(j=0; j<N; ++j)printf("%d\n", max(dp0[j], dp1[j]));}return 0; }?
?
轉載于:https://www.cnblogs.com/e0e1e/p/hdu_2196.html
總結
以上是生活随笔為你收集整理的Hdu 2196 - Computer的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 2009年广东省大学生程序设计竞赛 J
- 下一篇: mex+matlab2013b+vs20