Prim算法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=512,M=2e5+10,inf=0x3f3f3f3f;
int h[N],nex[M],to[M],v[M],con=1;
int d[N],vis[N];
void prim(int n)//O(n^2) 可处理重边,自环,负权边,负环
{
int ans=0;
memset(d,0x3f,sizeof(d));
d[1]=0;
for(int i=0;i<n;++i)
{
int tmp=inf,mid=0;
for(int j=1;j<=n;++j)
{
if(!vis[j]&&tmp>d[j])
{mid=j;tmp=d[j];}
}
if(!mid)
{
cout<<"impossible"<<endl;
return;
}
ans+=d[mid];vis[mid]=1;
for(int j=h[mid];j;j=nex[j])
{
d[to[j]]=min(d[to[j]],v[j]);
}
}
cout<<ans<<endl;
}
int main()
{
int n,m;cin>>n>>m;
while(m--)
{
int a,b,c;scanf("%d%d%d",&a,&b,&c);
nex[con]=h[a];
h[a]=con;
to[con]=b;v[con++]=c;
nex[con]=h[b];
h[b]=con;
to[con]=a;v[con++]=c;
}
prim(n);
return 0;
}
Kruskal算法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int c,t,v;
node(int x=0,int y=0,int z=0):c(x),t(y),v(z){}
}edge[200010];
int p[100010];
bool cmp(node a,node b)
{return a.v<b.v;}
int find(int x)
{return p[x]=x==p[x]?x:find(p[x]);}
int main()//O(mlogm)能带负权边
{
int n,m;cin>>n>>m;
for(int i=0;i<m;++i)
{
int a,b,c;scanf("%d%d%d",&a,&b,&c);
edge[i]=node(a,b,c);
}
sort(edge,edge+m,cmp);
for(int i=1;i<=n;++i)
p[i]=i;
int ans=0,cnt=0;
for(int i=0;i<m;++i)
{
node e=edge[i];
int fa=find(e.c),fb=find(e.t);
if(fa==fb)
continue;
p[fb]=fa;
ans+=e.v;
cnt++;
}
if(cnt==n-1)
cout<<ans<<endl;
else
cout<<"impossible"<<endl;
return 0;
}