最小生成树
模板
prim
#include<cstdio>
#include<iostream>
using namespace std;
int m,n;
int fst[5005];
int nxt[400005];
int v[400005];
int k[400005];
int used[40005];
int dis[40005];
int edge;
void add(int x,int y,int val)
{
edge++;
nxt[edge]=fst[x];
fst[x]=edge;
v[edge]=y;
k[edge]=val;
}
const int inf=1000000000;
int main()
{
scanf("%d%d",&n,&m);
int x,y,val;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&val);
add(x,y,val);
add(y,x,val);
}
for(int i=1;i<=n;i++)
dis[i]=inf;
int ans=0;
int now=1;
for(int i=1;i<n;i++)
{
//cout<<now<<endl;
used[now]=1;
dis[now]=0;
int minn=inf;
for(int j=fst[now];j;j=nxt[j])
{
if(k[j]<dis[v[j]])
{
dis[v[j]]=k[j];
}
}
for(int j=1;j<=n;j++)
{
if(!used[j]&&dis[j]<minn)
{
now=j;
minn=dis[j];
}
}
ans+=minn;
}
for(int i=1;i<=n;i++)
{
if(dis[i]==inf)
{
printf("orz");
return 0;
}
}
printf("%d",ans);
return 0;
}
kruscal算法
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
struct poi
{
int x,y,v;
}a[200005];
int fa[5005];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
bool cmp(poi a,poi b)
{
return a.v<b.v;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].v);
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
int ans=0;
for(int i=1;i<=m;i++)
{
int x=find(a[i].x);
int y=find(a[i].y);
if(x==y)continue;
ans+=a[i].v;
fa[x]=y;
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(fa[i]==i)cnt++;
}
if(cnt>1)
{
printf("orz");
return 0;
}
printf("%d",ans);
return 0;
}
浙公网安备 33010602011771号