题目链接:http://poj.org/problem?id=1258
Source File:
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=1<<30;
struct Edge{
int s,e,w;//起点,终点,权值
Edge(int ss,int ee,int ww):s(ss),e(ee),w(ww){}
Edge(){}
bool operator<(const Edge &e) const{
return w<e.w;//重载成权值小的优先
}
};
vector <Edge> edges;
vector <int> parent;
int getRoot(int a){
if(parent[a]==a)
return a;
parent[a]=getRoot(parent[a]);
return parent[a];
}
void Merge(int a,int b){
int p1=getRoot(a);
int p2=getRoot(b);
if(p1==p2)
return ;
parent[p2]=p1;
}
int main(){
int N;
while(cin>>N){
parent.clear();edges.clear();//相当于初始化
for(int i=0;i<N;i++)
parent.push_back(i);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
int w;
cin>>w;//输入各个权值
edges.push_back((Edge(i,j,w)));//把权值按照规定的函数存入
}
}
sort(edges.begin(),edges.end());
int done=0;int nTotalW=0;
for(int i=0;i<edges.size();i++){
if(getRoot(edges[i].s)!=getRoot(edges[i].e)){
Merge(edges[i].s,edges[i].e);
++done;
nTotalW+=edges[i].w;
}
if(done==N-1)
break;
}
cout<<nTotalW<<endl;
}
}
这里是用了并查集的处理思路:先把所有边按照代价大小从小到大排序,用结构体存储起点、终点还有权值。枚举每个节点,假如说起点等于终点,枚举结束。