prim算法
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100;
int p[maxn][maxn];
int vis[maxn];
int d[maxn];
int n,m;
int ans;
void prim()
{
for(int i=2; i<=n; i++) d[i]=p[1][i];
vis[1]=1;
for(int i=1; i<n; i++){
int k=0;
int minn = INT_MAX;
for(int i=1; i<=n; i++){
if(!vis[i]&&d[i]<minn){
minn = d[i];
k = i;
}
}
vis[k]=1;
ans += minn;
for(int j=1; j<=n; j++){
if(!vis[j]&&p[k][j]<d[j]){
d[j] = p[k][j];
}
}
}
}
int main() {
fill(p[0], p[maxn-1]+maxn, INT_MAX);
fill(vis,vis+maxn,0);
fill(d,d+maxn,INT_MAX);
cin >> n >> m;
int f,t,w;
for(int i=0; i<m; i++){
cin >> f >> t >> w; p[f][t]=w;p[t][f]=w;
}
prim(); cout << ans << endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100;
int p[maxn][maxn];
int vis[maxn];
int d[maxn];
struct node{
int x,y;
node(int x, int y):x(x),y(y){}
};
struct com{
bool operator()(node a, node b){
return a.y > b.y;
}
};
priority_queue<node,vector<node>,com> pq;
int n,m;
int ans;
void prim()
{
for(int i=2; i<=n; i++){
d[i] = p[1][i];
pq.push(node(i,d[i]));
}
vis[1]=1;
for(int i=1; i<n; i++){
node tem = pq.top();pq.pop();
int k = tem.x; ans += tem.y;
vis[k] = 1;
for(int j=1; j<=n; j++){
if(!vis[j]&&p[k][j] < d[j]){
d[j] = p[k][j]; pq.push(node(j,d[j]));
}
}
}
}
int main() {
fill(p[0],p[maxn-1]+maxn,INT_MAX);
fill(vis,vis+maxn,0);
fill(d,d+maxn,INT_MAX);
int f,t,w;
cin >> n >> m;
for(int i=0; i<m; i++){
cin >> f >> t >> w; p[f][t]=w; p[t][f]=w;
}
prim();
cout << ans << endl;
return 0;
}