#include <iostream> #include <string.h> #include <sstream> #include <math.h> #include <vector> #include <stack> #include <algorithm> using namespace std; struct Node { int startPoint; int endPoint; int len; bool operator <(const Node other) const { return len<other.len?true:false; } }; int findParent(int isAdded[],int point) { if(isAdded[point]==-1) return point; else return findParent(isAdded,isAdded[point]); } int main() { int n = 0; cin>>n; while(n!=0) { Node areaPoint[5000]; int totalCost = 0; if(n==1) { cout<<totalCost<<endl; cin>>n; continue; } int isAddEd[101]; int i; for(i=0;i<101;i++) isAddEd[i] = -1; int edge = 0; for(i=0;i<n*(n-1)/2;i++) { cin>>areaPoint[i].startPoint>>areaPoint[i].endPoint>>areaPoint[i].len; } sort(areaPoint,areaPoint+n*(n-1)/2); for(i=0;i<n*(n-1)/2;i++) { int start = areaPoint[i].startPoint; int rear = areaPoint[i].endPoint; int startParent = findParent(isAddEd,start); int rearParent = findParent(isAddEd,rear); //cout<<start<<" "<<rear<<" "<<startParent<<" "<<rearParent<<endl; if(startParent == rearParent) { continue; } else { isAddEd[startParent] = rearParent; totalCost += areaPoint[i].len; edge++; if(edge==n-1) break; } } cout<<totalCost<<endl; cin>>n; } return 1; }
- 题目描述:
-
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
- 输入:
-
测试输入包含若干测试用例。每个测试用例的第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解题思路: 存储每一条边,以及对应的2个端点,按边的长度排序 对每一条边进行遍历,如果该边的2个端点的父节点相同,表示当前边不能加入,如果加入则会形成环,否则加入,并修改起点的父亲的父亲为终点的父亲。 每加入一条边,计数器加1,当计数器为n-1时结束循环,避免后面没必要的遍历。
时间: 2024-10-16 15:47:36