11年福州 F 次小生成樹變形 樹形DP

2021-07-13 10:18:58 字數 2215 閱讀 7701

單獨練習的時候,做到最小生成樹處理出來後,就不知道怎麼處理了。關鍵是兩個子樹間的距離,不能在有效的時間複雜度內解決。

實際上,對於乙個最小生成樹,兩個子樹間距離可以用dp來做。

假設從root開始向下搜尋,那麼dp[root][u]表示root到u和以u為根節點的子樹的最小距離,此處距離即是取的不在最小生成樹中的原圖的邊。那麼很容易發現是乙個簡單的樹形dp過程。

然後,如果對於兩個子樹呢?兩個子樹是的並集是最小生成樹,設兩個子樹的連線邊為(u,v),那麼此時兩個子樹最小距離為dp[k][v],k為u或者以u為根節點的子節點。

實際上,這種方法應該可以擴充套件到最小生成樹的一些其他題目?

調**的時候出現一些小插曲,prime演算法攜程dijkstra一直沒改出來……prime演算法加新點進去後,dis更新為dis[v] = min(dis[v], g[u][v]),dijkstra為dis[v] = min(dis[v], dis[u] + g[u][v])

失分點/學習地方:

1. 兩個子樹距離

2. 最小生成樹prime演算法

#include 

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define inf (1000000007)

#define ll long long

const

int maxn = 3000 + 5;

int n, m;

int g[maxn][maxn], dp[maxn][maxn], best[maxn][maxn];

ll mst;

vector

e[maxn];

///prime use

int vis[maxn], dis[maxn], pre[maxn];

void prime()

}mst = 0;

for(int t = 2 ; t <= n ; t++)

}mst += mindis;

vis[re] = 1;

if(pre[re] != -1)

for(int i = 0 ; i < n ; i++) }}

}int dfs1(int u, int fa, int root)

if(fa != root) dp[root][u] = min(dp[root][u], g[root][u]);

return dp[root][u];

}int dfs2(int u, int fa, int root)

return ans;

}int main()

prime();

// printf("mst = %d\n", mst);

// puts("pre");

// for(int i = 0 ; i < n ; i++) printf("%d ", pre[i]);

// puts("\npre");

for(int i = 0 ; i < n ; i++) dfs1(i, -1, i);

for(int i = 0 ; i < n ; i++)

}// printf("\ndp\n");

// for(int i = 0 ; i < n ; i++)

// puts("dp");

// printf("best\n");

// for(int i = 0 ; i < n ; i++)

// puts("best");

double res = 0;

int q; scanf("%d", &q);

for(int i = 0 ; i < q ; i++)

}// printf("ok = %d, g[u][v] = %d\n", ok, g[u][v]);

if(ok == 0) res += mst;

else

}printf("%.4f\n", res / (1.0 * q));

}return

0;}

修路方案 最小生成樹變形 次小生成樹

時間限制 3000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍率領著許多部隊,它們分別駐紮在n個不同的城市裡,這些城市分別編號1 n,由於交通不太便利,南將軍準備修路。現在已經知道哪些城市之間可以修路,如果修路,花費是多少。現在,軍師小工已經找到了一種修路的方案,能夠使各個城市都聯通...

HDU 4081 次小生成樹變形

題意是有n個點,分別輸入n個點的座標和這個點的權值,然後要給這些點建邊,建邊的權值就是兩點間的距離,現在可以免費的建一條邊,求免費建邊的兩個點的權值和與總費用的最大值。思路就是模擬次小生成樹的思路,在刪邊的過程中維護所要求的最大值就好了。ac include define maxn 1005 def...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...