【模板】Prim

今天的题又用到了这个已经吃灰了的东西,来复习一下。

#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
const int N = 4096+1024;
vector<pair<int,int>> to[N];
int n, m;
int dis[N];
bool visit[N];
int Prim() {
    int res = 0;
    dis[1] = 0;
    visit[1] = true;
    for(auto v : to[1]) 
        dis[v.first] = min(v.second,dis[v.first]);
    for(int i = 2;i <= n;++i) {
        int u = 0;
        for(int j = 2;j <= n;++j) {
            if(!visit[j]&&(!u||dis[j] < dis[u])) 
                u = j;
        }
        if(dis[u] == dis[0]) return -1;
        visit[u] = true;
        res += dis[u];
        for(auto v : to[u]) 
            dis[v.first] = min(dis[v.first],v.second);
    }
    return res;
}
signed main() {
    scanf("%d %d",&n,&m);
    for(int i = 1, f, t, w;i <= m;++i) {
        scanf("%d %d %d",&f,&t,&w);
        to[f].push_back(make_pair(t,w));
        to[t].push_back(make_pair(f,w));
    }
    memset(dis,0x3f,(n+1)*sizeof(int));
    int ans = Prim();
    printf(ans < 0 ? "orz\n" : "%d",ans);
    return 0;
}

tmd,我跟一个普及板子斗智斗勇,真有我的。

#include<bits/stdc++.h>
using namespace std;
const int z = 1024;
int in[z][z], dis[z], n;
int prim(int k) {
	int p = 0, tmp;
	for(int i = 1;i <= n;++i) dis[i] = in[k][i];
	dis[k] = 0;
	for(int i = 2;i <= n;++i) {
		int minn = 65535;
		for(int j = 1;j <= n;++j) 
			if(dis[j] < minn&&dis[j] != 0) {
				minn = dis[j];
				tmp = j;
			}
		p += dis[tmp];
		dis[tmp] = 0;
		for(int j = 1;j <= n;++j)
			dis[j] = min(dis[j],in[tmp][j]);
	}
	return p;
}
int main() {
	scanf("%d",&n);
	for(int i = 1;i <= n;++i)
		for(int j = 1;j <= n;++j) 
			scanf("%d",&in[i][j]);
	printf("%d",prim(1));
	return 0;
}

@bikuhiku

posted @ 2022-06-05 20:59  bikuhiku  阅读(3)  评论(0编辑  收藏  举报