做題記錄 Luogu P4878
阿新 • • 發佈:2021-06-26
PART1
1.實現:每次選【離源點集合最近的邊】,將其加入源點集合
(有點像dijkstra【選離源點最近的點】)
將邊集 EEE 的每條邊,按權值從小到大進行排序
2.時間複雜度:
3.特別優勢:
4.適用情況:
5.需要注意的點:
要建立雙向邊,而kruskal則不用
PART2
1.基礎演算法
//prim:返回生成樹的總路徑大小 bool vis[N];//判斷是否在源點集合裡面 int Prim(int n) { int sum = 0;//總路徑 int dis[N];//dis[i]是源點集合到i的距離,與dijkstra中單個的出發源點到i的距離不同 memset(dis, 0x3f, sizeof(dis)); memset(vis, false, sizeof(vis)); //這是出發源點(還沒被加入源點集合) dis[1] = 0; //一共要加入n個點 for(int i = 0; i < n; ++i) { //找出不在源點中,距離源點集合最小的點 int minV = -1; int minD = inf; for(int j = 1; j <= n; ++j) { if(!vis[j] && dis[j] < minD) { minD= dis[j]; minV = j; } } //如果圖不連通 if(minV == -1) { return false; } //加入此結點 vis[minV] = true; sum += minD; //和dijkstra不同處,這裡是用邊的距離直接更新dis,與dis的定義相符合 for(int j = p[minV]; j != -1; j = e[j].next) {int v = e[j].v; dis[v] = min(dis[v], e[j].w); } } return sum; }
PART3
PART4
PART5