세 번째 알고리즘 최소 스패닝 트리 알고리즘 Borůvka

세 번째 알고리즘 최소 스패닝 트리 알고리즘 Borůvka

기본적인 아이디어 :

가까운 이웃의 고정 배열과 각 하위 트리를 기록합니다.

각각의 에지에 대한 처리 :

이 에지가 같은 집합에 속하는 두 꼭지점에 연결되어있는 경우,하지 처리, 또는이 두 개의 서브 - 트리의 최소 측에 접속되는 경우 두 개의 서브 트리들이이 가장자리에 연결되어 검출 (병합)이 업데이트된다.

역할 :

그래서 당신은 알고리즘, 크루스 칼, 꼼꼼한 알고리즘에 무엇을 사용하지 마십시오입니까? 그들은 좋은 있지만, 일부는받을 수 있습니다 더 우수 세 번째 방법을 사용합니다. 이러한 점 1E5 레벨은 N, m은 에지의 개수 N ^ 2 -level지도하지만, 각면의 최소 포인트는 신속하게, 우리가 이하로 유지 수 없었다 최소 스패닝 트리를 문제를 알아낼 수 있습니다. 해당 공간의 복잡성 만 점의 수와 관련이 있기 때문에 이번에는 알고리즘 Borůvka의 유용성을 반영한다.

코드 :

struct node {int x, y, w; } edge[M];
int d[N];   // 各子树的最小连外边的权值
int e[N];   // 各子树的最小连外边的索引
bool v[M];  // 防止边重复统计

int fa[N];
int find(int x) {return x==fa[x] ? x : (fa[x]=find(fa[x])); }
void join(int x, int y) {fa[find(x)]=find(y); }

int Boruvka() {
    int tot=0;
    for (int i=1; i<=n; ++i) fa[i]=i;
    while (true) {
        int cur=0;
        for (int i=1; i<=n; ++i) d[i]=inf;
        for (int i=1; i<=m; ++i) {
            int a=find(edge[i].x), b=find(edge[i].y), c=edge[i].w;
            if (a==b) continue;
            cur++;
            if (c<d[a] || c==d[a] && i<e[a]) d[a]=c, e[a]=i;
            if (c<d[b] || c==d[b] && i<e[b]) d[b]=c, e[b]=i;
        }
        if (cur==0) break;
        for (int i=1; i<=n; ++i) if (d[i]!=inf && !v[e[i]]) {
            join(edge[e[i]].x, edge[e[i]].y), tot+=edge[e[i]].w;
            v[e[i]]=true;
        }
    }
    return tot;
}


참조 :
https://www.cnblogs.com/greyqz/p/9536352.html

게시 51 개 원래 기사 · 원 찬양 6 · 전망 6308

추천

출처blog.csdn.net/weixin_40859716/article/details/104194526