Description
Your task is to design the network for the area, so that there is a connection (direct or indirect) between every two points (i.e., all the points are interconnected, but not necessarily by a direct cable), and that the total length of the used cable is minimal.
Input
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
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 120
很简单的一个最小生成树
克鲁斯卡尔
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> #define maxn 11000 #define oo 0x3f3f3f3f using namespace std; int father[maxn], n, m; struct node { int u, v; double w; } s[maxn*100]; struct point { int x, y; } a[maxn]; int Find(int x) { while(x!=father[x]) { x=father[x]; } return x; } int cmp(node p, node q) { return p.w<q.w; } int main() { int u, v, w; while(scanf("%d",&n), n) { scanf("%d", &m); for(int i=1; i<=n; i++) father[i] = i; for(int i=0; i<m; i++) { scanf("%d %d %d", &u, &v, &w); s[i].u = u; s[i].v = v; s[i].w = w; } sort(s, s+m, cmp); int ans = 0; for(int i=0; i<m; i++) { int ru = Find(s[i].u); int rv = Find(s[i].v); if(ru != rv) { father[ru] = rv; ans += s[i].w; } } printf("%d\n", ans); } return 0; }
普利姆