ACM算法竞赛——朴素版prim算法(模板)

2022-05-18 10:40:47 浏览数 (2)

普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。(百度百科)

代码语言:txt复制
int n;      // n表示点数
int g[N][N];        // 邻接矩阵,存储所有边
int dist[N];        // 存储其他点到当前最小生成树的距离
bool st[N];     // 存储每个点是否已经在生成树中

//如果图不连通,则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和
int prim()
{
    memset(dist, 0x3f, sizeof dist);
    
    dist[1] = 0;
    
    int res = 0;
    for(int i = 0; i < n; i   )
    {
        int t = -1;
        for(int j = 1; j <= n; j   )
            if(!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
                
        if(dist[t] == INF) return INF;
        
        res  = dist[t];
        
        st[t] = true;
        
        for(int j = 1; j <= n; j   )
            dist[j] = min(dist[j], g[t][j]);
    }
    
    return res;
}

0 人点赞