poj1258-Agri-Net-最小生成树

应该用prim,因为不是稀疏图,但是写习惯kruskal…下次写prim(?

写一道水题聊以慰藉……咦忘记写当道路=n-1的时候break(捂脸

#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 10005
int fa[maxn];
typedef struct node
{
 int x;
 int y;
 int c;
}node;
node nod[maxn];
int comp(node a,node b){return a.c<b.c;}
void init(int n)
{
 for(int i=1;i<=n;i++)
  fa[i]=i;
}
int find(int x)
{
 if(fa[x]==x)
  return x;
 else return fa[x]=find(fa[x]);
}
void uni(int x,int y)
{
 int ffx=find(x);
 int ffy=find(y);
 fa[ffx]=ffy;
}
int main()
{
 int n;
 while(cin>>n)
 {
 int temp;
 int index=0;
 for(int i=1;i<=n;i++)
 {
  for(int j=1;j<=n;j++)
  {
   cin>>temp;
   if(i<j)
   {
   nod[index].c=temp;
   nod[index].x=i;
   nod[index].y=j;
   index++;
   }
  }
 }
 init(n);
 int ans=0;
 int cnt=0;
 sort(nod,nod+index,comp);
 for(int i=0;i<index;i++)
 {
  if(find(nod[i].x)!=find(nod[i].y))
  {
   uni(nod[i].x,nod[i].y);
   ans+=nod[i].c;
   cnt++;
   if(cnt==n-1) break;
  }
 }
 cout<<ans<<endl;
 }
}
上一篇:ACwing(基础)--- Prim


下一篇:最小生成树-Prim算法