1. 程式人生 > 其它 >做題記錄 Luogu P4878

做題記錄 Luogu P4878

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