【模板】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;
}