Input
The first line is an integer N (3 <= N <= 100), which is the number of villages. Then come N lines, the i-th of which contains N integers, and the j-th of these N integers is the distance (the distance should be an integer within [1, 1000]) between village i and village j. Then there is an integer Q (0 <= Q <= N * (N + 1) / 2). Then come Q lines, each line contains two integers a and b (1 <= a < b <= N), which means the road between village a and village b has been built.Output
You should output a line contains an integer, which is the length of all the roads to be built such that all the villages are connected, and this value is minimum.Sample Input
3 0 990 692 990 0 179 692 179 0 1 1 2Sample Output
179 #include <cstdio> #include <iostream> #include <cmath> #include <string> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define ll long long const int inf = 0x3f3f3f3f; const int maxn = 1e8; int n, sum, sign[108]; struct point { int u, v, len; }root[10008]; void init() { for(int i = 0; i<108; i++) sign[i] = i; } int get(int x) { if(x != sign[x]) { sign[x] = get(sign[x]); return sign[x]; } else return x; } int bcj(int x, int y) { int a = get(x), b = get(y); if(a == b)return 0; else return 1; } bool cmp(point a, point b) { return a.len<b.len; } int main() { init(); sum = 0; scanf("%d", &n); int j = 0; for(int i = 1; i <= n; i++) { for(int miao = 1; miao <= n; miao++,j++) { root[j].u = i; root[j].v = miao; scanf("%d", &root[j].len); // printf("%d %d %d j = %d\n", root[j].u, root[j].v, root[j].len, j); } } int q, a, b, cnt = 0; scanf("%d", &q); for(int i = 0; i<q; i++) { scanf("%d%d", &a, &b); sign[get(a)] = get(b);//使a点与b点合并 } sort(root, root+j, cmp); for(int i = 0; i<j; i++)//遍历j条边 { if(bcj(root[i].u, root[i].v)) { cnt++; sum += root[i].len; sign[get(root[i].u)] = get(root[i].v);//将点标记为相连的状态,避免路径加重(chong) } if(cnt == n-1)break; } printf("%d\n", sum); return 0; }
转载于:https://www.cnblogs.com/RootVount/p/10519910.html
相关资源:JAVA上百实例源码以及开源项目