P1546 最短网络 Agri-Net 最小生成树的总权值
Prim算法:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<map>
#define MAX 105
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n;
int visit[MAX],dis[MAX],mp[MAX][MAX];
void prim(){
for(int i=0;i<MAX;i++){
visit[i]=0;
}
for(int i=1;i<=n;i++){
dis[i]=mp[1][i];
}
visit[1]=1;
for(int i=1;i<=n-1;i++){
int minl=INF,u=-1;
for(int j=1;j<=n;j++){
if(visit[j]==0&&dis[j]<minl){
minl=dis[j];
u=j;
}
}
visit[u]=1;
for(int v=1;v<=n;v++){
if(visit[v]==0&&mp[u][v]<dis[v]){
dis[v]=mp[u][v];
}
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
mp[i][j]=INF;
}
}
int len;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&len);
mp[i][j]=min(len,mp[i][j]);
}
}
prim();
int ans=0;
for(int i=1;i<=n;i++){
ans+=dis[i];
}
printf("%d",ans);
return 0;
}
Kruskal算法:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<map>
#define MAX 105
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n;
int fa[MAX];
int findfather(int x){
if(x!=fa[x]){
return fa[x]=findfather(fa[x]);
}
return fa[x];
}
struct edge{
int a,b,len;
}e[MAX*MAX];
bool cmp(edge a,edge b){
return a.len<b.len;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
fa[i]=i;
}
int num=0;
int len;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&len);
if(j<=i){
continue;
}
e[num].a=i;
e[num].b=j;
e[num++].len=len;
}
}
sort(e,e+num,cmp);
int ans=0;
for(int i=0;i<num;i++){
if(findfather(e[i].a)!=findfather(e[i].b)){
fa[findfather(e[i].a)]=findfather(e[i].b);
ans+=e[i].len;
}
}
printf("%d",ans);
return 0;
}