-
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
本题是接触的最小生成树问题的第一题。最小生成树问题在并查集的结构上实现kruskal算法即可。
收获如下:
①在做这道题时顿悟了并查集结构的实质:并查集的实质就是图。可声明并查集结构体,内含vector<struct vex>结构体数组,struct vex中含有顶点的所有信息,包括此顶点的“root域”(详见自写的并查集模板)。且并查集结构体中可加入邻接链表vector数组来存储边表。故此处采用的就是这种图(并查集)结构的简化版:1.由于顶点信息只有root域,故vector<struct vex>数组直接简化为root的整型数组。2.由于kruskal算法只需要遍历非递减边表的操作,故并查集结构体内的邻接链表简化为一个vector<Edge>一维边表。
题目描述:
-
输入:
-
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
-
输出:
-
对每个测试用例,在1行里输出最小的公路总长度。
-
样例输入:
-
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
-
样例输出:
-
3 5
-
答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7741-1-1.html
#include <iostream>
#include <vector>
#include <algorithm>
#define MAXSIZE 1000
using namespace std;
struct Edge{
int start,end;
int weight;
Edge(){
}
Edge(int start,int end,int weight){
this->start=start;
this->end=end;
this->weight=weight;
}
};
bool cmp(Edge a,Edge b){
return a.weight<b.weight;
}
struct Set{
int root[MAXSIZE];
int setSize;
vector<Edge> edge;
int initSet(int setSize){
this->setSize=setSize;
edge.clear();
for (int i=0;i<setSize;i++){
root[i]=-1;
}
}
int findRoot(int x){
if (root[x]==-1)
return x;
else
return root[x]=findRoot(root[x]);
}
int unionSet(int x,int y){
int xroot=findRoot(x);
int yroot=findRoot(y);
if(xroot!=yroot){//if x&y are not in the same set
root[xroot]=yroot;
return yroot;
}
return -1;
}
};
int main(){
int n;
int start,end,weight;
int totalWeight;
Set set;
while (cin>>n,n){
//initiate
set.initSet(n);
totalWeight=0;
//input
for (int i=0;i<n*(n-1)/2;i++){
cin>>start>>end>>weight;
start--;end--;
set.edge.push_back(Edge(start,end,weight));
}
//sort
sort(&set.edge[0],&set.edge[0]+set.edge.size(),cmp);
//traverse edge[]
for (int i=0;i<set.edge.size();i++){
if (set.unionSet(set.edge[i].start,set.edge[i].end)>-1){
//set.edge[i].used=true;
totalWeight+=set.edge[i].weight;
}
}//按照题意不可能出现非连通图的状态,故无需判断最终是否联通
//output
cout<<totalWeight<<endl;
}
return true;
}