單獨練習的時候,做到最小生成樹處理出來後,就不知道怎麼處理了。關鍵是兩個子樹間的距離,不能在有效的時間複雜度內解決。
實際上,對於乙個最小生成樹,兩個子樹間距離可以用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的生成樹,而各邊權和最小的生成樹則被稱...