Highways
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 26220 | Accepted: 11971 |
题目大意:要在城市与城市之间修路,且要把所有城市连起来,且总路程最短,求所有已建成的公路中最长的公路,并输出其长度:
Sample Input
1 3 0 990 692 990 0 179 692 179 0
Sample Output
692
已Accept代码【c++提交】
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
int pre[250000];
struct ak{
int x, y, dis;
}rela[250000];
void init() {
for(int i = 0; i < n; i++)
pre[i] = i;
}
int cmp(ak c, ak e) {
return c.dis < e.dis;
}
int find(int x) {
int r = x;
while(r != pre[r])
r = pre[r];
int i = x, j;
while(i != r) { //压缩路径
j =pre[i];
pre[i] = r;
i = j;
}
return r;
}
bool join(int x, int y) {
int fx = find(x);
int fy = find(y);
if(fx != fy) {
pre[fx] = fy;
return true;
}
return false;
}
int Scanf_a() {
int a, q = 0, total = 0;
scanf("%d", &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
scanf("%d", &a);
if(i != j) {
rela[q].x = i;
rela[q].y = j;
rela[q++].dis = a;
}
}
int k = 0;
init();
sort(rela, rela + q, cmp);
for(int i = 0; i < q; i++) {
if(join(rela[i].x, rela[i].y))
k++;
if(k == n - 1){
total = rela[i].dis;
break;
}
}
return total;
}
void Printf_a(int total) {
printf("%d\n", total);
}
int main() {
int t;
scanf("%d", &t);
while(t--) {
Printf_a(Scanf_a());
}
return 0;
}