POJ1258 最小生成树 kruskal
输入数据有多组,,没有结束标记,需要注意一下,用scanf != EOF
代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int MAXN = 105;
int f[MAXN];
int fcnt = 0;
struct Edge{
int u;
int v;
int cost;
Edge(int u_,int v_,int cost_){
u = u_;
v = v_;
cost = cost_;
}
};
vector<Edge> e;
void UFinit(int n){
for(int i = 0;i < n;i++){
f[i] = i;
}
fcnt = n;
}
int find(int a){
return a==f[a]?a:find(f[a]);
}
bool unit(int a,int b){
if(find(a)!=find(b)){
f[find(a)] = find(b);
fcnt--;
return true;
}
else return false;
}
bool cmp(Edge a,Edge b){
return a.cost<b.cost;
}
int kruskal(int n){
sort(e.begin(),e.end(),cmp);
UFinit(n);
int cnt = 0;
for(int i = 0;i < e.size();i++){
if(find(e[i].u) != find(e[i].v)){
unit(e[i].u,e[i].v);
cnt+=e[i].cost;
}
}
if(fcnt == 1) return cnt;
else return -1;
}
int main(){
int N;
while(scanf("%d",&N)!=EOF){
for(int i = 0;i < N;i++)
for(int j = 0;j < N;j++){
int tmp;
cin>>tmp;
e.push_back(Edge(i,j,tmp));
}
cout<<kruskal(N)<<endl;
e.clear();
}
}
980K 110MS