标签:style blog io ar color os sp for strong
#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时结束循环,避免后面没必要的遍历。
标签:style blog io ar color os sp for strong
原文地址:http://www.cnblogs.com/55open/p/4121133.html