最小生成树

kruskal算法

#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
  int u,v,w;
}e[10010];
int p[10010],m,n;
bool cmp(node x,node y)
{
  return x.w<y.w;
}
int find(int x)
{
  return x==p[x]?x:p[x]=find(p[x]);
}
void kru()
{
  int i,fx,fy,ans=0;
  for(i=0;i<m;i++)
  {
    fx=find(e[i].u);
    fy=find(e[i].v);
    if(fx!=fy)
    {
      p[fx]=fy;
      ans+=e[i].w;
    }
  }
  cout<<ans<<endl;
}
int main()
{
  int i,j;
  while(cin>>n)
  {
    m=0;
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=n;j++)
      {
        cin>>e[m].w;
        e[m].u=i;
        e[m].v=j;
        m++;
      }
    }
    sort(e,e+m,cmp);
    for(i=0;i<=n;i++) p[i]=i;
    kru();
  }
}



prim算法,beg为起点

#include<iostream>
using namespace std;
const int MAX=1000000000;
int map[101][101],n;
int prim(int beg)
{
  int i,j,mini,num,sum=0;
  int dis[101];
  bool visit[101];
  for(i=1;i<=n;i++)
  {
    dis[i]=MAX;
    visit[i]=true;
  }
  dis[beg]=0;
  for(i=1;i<=n;i++)
  {
    mini=MAX;
    for(j=1;j<=n;j++)
      if(visit[j]&&mini>dis[j])
      {
        num=j;
        mini=dis[j];
      }
    sum+=mini;
    visit[num]=false;
    for(j=2;j<=n;j++)
      if(visit[j]&&dis[j]>map[num][j])
      dis[j]=map[num][j];
  }
  return sum;
}
int main()
{
  int i,j;
  while(cin>>n)
  {
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
      cin>>map[i][j];
    for(i=1;i<=n;i++) map[i][i]=MAX;
    cout<<prim(1)<<endl;
  }
}


你可能感兴趣的:(最小生成树)