prim朴朴素素
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,minn,k,ans;
const int INF=0x7fffffff/2;
int f[1000000],mn[1000000];
int a[5001][5001];
int x,y,w;
int main() {
int i,j;
scanf("%d%d",&n,&m);
memset(a,0x7f,sizeof(a));
for(i=1; i<=m; i++) {
scanf("%d%d%d",&x,&y,&w);
a[y][x]=a[x][y]=min(a[y][x],w);
}
memset(mn,0x7f,sizeof(mn));
mn[1]=0;
for(i=1; i<=n; i++) {
minn=INF;
for(j=1; j<=n; j++)
if(f[j]==0&&mn[j]<minn) {
minn=mn[j];
k=j;
}
f[k]=1;
ans+=minn;
for(j=1; j<=n; j++)
if(f[j]==0&&mn[j]>a[k][j]) mn[j]=a[k][j];
}
cout<<ans<<endl;
return 0;
}
prim结构体
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 0x7f7ff;
using namespace std;
int n,m,head[5010],x,y,z,cnt,ans;
int mn[5010],f[5010];
struct deliver{
int to;
int nexty;
int w;
}edge[400010];
void add(int u,int v,int c) {
cnt++;
edge[cnt].nexty=head[u];
edge[cnt].to=v;
edge[cnt].w=c;
head[u]=cnt;
}
int main() {
int i,j,k;
cin>>n>>m;
for(i=1;i<=m;i++) {
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
memset(mn,0x7f,sizeof(mn));
mn[1]=0;
for(i=1;i<=n;i++) {
int minn=INF;
for(j=1;j<=n;j++) {
if(f[j]==0&&mn[j]<minn) {
k=j;
minn=mn[j];
}
}
f[k]=1;
ans+=mn[k];
for(j=head[k];j;j=edge[j].nexty) {
int r=edge[j].to;
if(f[r]==0&&mn[r]>edge[j].w) mn[r]=edge[j].w;
}
}
cout<<ans<<endl;
return 0;
}
krus
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,ans,cnt;
int f[200009];
struct deliver {
int z;
int x;
int y;
}b[200009];
int find(int k) {
if(f[k]==k) return k;
f[k]=find(f[k]);
return f[k];
}
int cmp(deliver p,deliver q) {
return p.z<q.z;
}
void krs() {
int i;
for(i=1;i<=m;i++)
if(find(b[i].x)!=find(b[i].y)) {
ans+=b[i].z;
f[find(b[i].x)]=find(b[i].y);
cnt++;
if(cnt==n-1) break;
}
}
int main() {
int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=m;i++) {
scanf("%d%d%d",&b[i].x,&b[i].y,&b[i].z);
//f[find(b[i].x)]=find(b[i].y);多余
}
sort(b,b+m+1,cmp);
krs();
cout<<ans;
return 0;
}