最小生成树
Prim
#include<bits/stdc++.h>
using namespace std;
struct edge
{
int v,w,next;
}e[200005<<1];
int head[5005],dis[5005],cnt,n,m,tot,now=1,ans,inf=123456789;
bool vis[5005];
void add(int u,int v,int w)
{
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
int prim()
{
for(int i=2;i<=n;i++)
{
dis[i]=inf;
}
for(int i=head[1];i!=0;i=e[i].next)
{
dis[e[i].v]=min(dis[e[i].v],e[i].w);
}
while(++tot<n)
{
int minn=inf;
vis[now]=1;
for(int i=1;i<=n;i++)
{
if(vis[i]==0&&minn>dis[i])
{
minn=dis[i];
now=i;
}
}
ans+=minn;
for(int i=head[now];i;i=e[i].next)
{
int v=e[i].v;
if(dis[v]>e[i].w&&!vis[v])
{
dis[v]=e[i].w;
}
}
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
printf("%d",prim());
return 0;
}
Kruskal
#include<bits/stdc++.h>
using namespace std;
struct jade
{
int x,y,v;
}e[200010];
int fa[5010],n,m,ans,cnt;
bool cmp(jade x,jade y)
{
return x.v<y.v;
}
int find(int x)
{
if(x==fa[x])
{
return x;
}
fa[x]=find(fa[x]);
return fa[x];
}
void kru()
{
sort(e+1,e+1+m,cmp);
for(int i=1;i<=m;i++)
{
int fx=find(e[i].x);
int fy=find(e[i].y);
if(fx==fy)
{
continue;
}
ans+=e[i].v;
fa[fy]=fx;
cnt++;
if(cnt==n-1)
{
break;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=m;i++)
{
int x,y,v;
cin>>x>>y>>v;
e[i].x=x;
e[i].y=y;
e[i].v=v;
}
kru();
if(cnt==n-1)
{
cout<<ans<<endl;
}
else
{
cout<<"orz"<<endl;
}
return 0;
}
OVO%%dalao
以下是签名
${\scr {jade }}$ ${\scr {seek }}$
本文来自博客园,作者:BIxuan—玉寻,转载请注明原文链接:https://www.cnblogs.com/zhangyuxun100219/p/18881401

浙公网安备 33010602011771号