最小生成树【模板】

Prim算法

复杂度:O(N*N)

#include
using namespace std;
const int maxn = 1005;
int n;
int d[maxn], vis[maxn], mat[maxn][maxn];
int main(){
    int End, ans = 0;
    memset(d, 0x3f3f3f3f, sizeof(d));
    d[1] = 0;
    scanf("%d", &n);
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            scanf("%d", &mat[i][j]);
        }
    }
    for(int i=1; i<=n; i++){
        End = -1;
        for(int j=1; j<=n; j++){
            if(!vis[j] && (End==-1 || d[j]mat[End][j]){
                d[j] = mat[End][j];
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}

堆优化的Prim算法

复杂度:O(MlogM)

#include
using namespace std;
const int maxn = 100005;
typedef pair P;
vector

g[maxn]; priority_queue, greater

> pq; int n, m; int vis[maxn]; int main(){ int ans; scanf("%d%d", &n, &m); for(int i=1; i<=m; i++){ int t1, t2, t3; scanf("%d%d%d", &t1, &t2, &t3); g[t1].push_back(make_pair(t3, t2)); g[t2].push_back(make_pair(t3, t1)); } for(int i=0; i

Kruscal算法

复杂度:O(MlogM+M*Ackermann'(M))

#include
using namespace std;
const int maxn = 1000005;
typedef struct {
    int from, to, val;
}N;
N edge[maxn];
int n, m;
int pre[maxn];
bool cmp(N a, N b){
    return a.val < b.val;
}
int Find(int x){
    int p, tmp;
    p = x;
    while(x != pre[x]){
        x = pre[x];
    }
    while(p != x){
        tmp = pre[p];
        pre[p] = x;
        p = tmp;
    }
    return x;
}
int main(){
    int ans;
    scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        pre[i] = i;
    }
    for(int i=1; i<=m; i++){
        scanf("%d%d%d", &edge[i].from, &edge[i].to, &edge[i].val);
    }
    sort(edge+1, edge+m+1, cmp);
    ans = 0;
    for(int i = 1; i<=m; i++){
        int p = Find(edge[i].from);
        int q = Find(edge[i].to);
        if(p != q){
            ans += edge[i].val;
            pre[p] = q;
        }
    }
    printf("%d\n", ans);
    return 0;
}

你可能感兴趣的:(最小生成树【模板】)