hdu 1233

克魯斯卡爾算法 使用並查集檢測是否構成迴路決定邊是否能夠加入:

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int part[100];
struct node//克魯斯卡爾算法是加邊法,使用node結構表示邊信息,而不是prim的數組
{
 int from;
 int to;
 int cost;
};
vector<node> Vec;

int getFa(int n)
{
 if(part[n]==n)return n;
 part[n]=getFa(part[n]);
 return part[n];
}

bool merge(int x,int y)
{
 if(getFa(x)==getFa(y))return false;
 part[getFa(y)]=x;return true;
}
bool cmp(node x,node y)
{
 return x.cost<y.cost;
}
int main()
{
 int n;
 while(cin>>n&&n)
 {
  Vec.clear();
  for (int i=1;i<=n;i++)part[i]=i;
  int from,to,cost;
  int m=n*(n-1)/2;
  node temp;
  while(m--)
  {
   cin>>from>>to>>cost;
   temp.from=from;
   temp.to=to;
   temp.cost=cost;
   Vec.push_back(temp);   
  }
  sort(Vec.begin(),Vec.end(),cmp);//一開始傻到用vec作爲迭代器,汗
  int count=n-1;
  int sum=0;
  for(vector<node>::iterator iter=Vec.begin();iter!=Vec.end();iter++)
   if(merge(iter->from,iter->to))
   {
    sum+=iter->cost;
    count--;
    if(!count)break;
   }
   cout<<sum<<endl;     
 }
 return 1;
}

發佈了39 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章