Input
The input file consists of a number of data sets. Each data set defines one required network. The first line of the set contains two integers: the first defines the number P of the given points, and the second the number R of given routes between the points. The following R lines define the given routes between the points, each giving three integer numbers: the first two numbers identify the points, and the third gives the length of the route. The numbers are separated with white spaces. A data set giving only one number P=0 denotes the end of the input. The data sets are separated with an empty line. The maximal number of points is 50. The maximal length of a given route is 100. The number of possible routes is unlimited. The nodes are identified with integers between 1 and P (inclusive). The routes between two points i and j may be given as i j or as j i.Output
For each data set, print one number on a separate line that gives the total length of the cable used for the entire designed network.Sample Input
1 0 2 3 1 2 37 2 1 17 1 2 68 3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32 5 7 1 2 5 2 3 7 2 4 8 4 5 11 3 5 10 1 5 6 4 2 12 0Sample Output
0 17 16 26 #include <cstdio> #include <iostream> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define ll long long const int maxn = 100+8; const int inf = 0x3f3f3f; int p, r, sign[maxn]; struct point//用结构体,更容易对边进行遍历 { int u, v, w; }root[58]; int init()//使每个点在初始不与任何点相连 { for(int i = 0; i<maxn; i++) sign[i] = i; } int get(int x)//寻找祖先 { if(sign[x] == x)//判断x点是否为末节点 return x; else//如果不是末节点,那就找它的祖先 { sign[x] = get(sign[x]); return sign[x]; } } int bcj(int x, int y)//看x点与y点是否同一个祖先 { int t1 = get(x); int t2 = get(y); if(t1 == t2) return 0;//如果x点与y点同一个祖先,那就不需要任何操作 else//如果不同祖先,则使他们变成同一个祖先 { sign[t1] = t2; return 1; } } int cmp(point a, point b)//使边从小到大排序 { return a.w<b.w; } int main() { while(~scanf("%d", &p) && p) { scanf("%d", &r); init(); int sum = 0, cnt = 0; for(int i = 0; i<r; i++) { scanf("%d%d%d", &root[i].u, &root[i].v, &root[i].w); } sort(root, root+r, cmp);//使边从小到大排序 for(int i = 0; i<r; i++) { if(bcj(root[i].u, root[i].v))//判断u与v是否同一个祖先,判断成功则为不同祖先 { cnt++; sum += root[i].w;//既然不同祖先,就让他们的边相加 } if(cnt == p-1)break;//最小生成树只有n-1条边 } printf("%d\n", sum); } return 0; }
转载于:https://www.cnblogs.com/RootVount/p/10513333.html