POJ - 1797 Heavy Transportation
POJ - 1797 题目链接
整体来看这道题目和青蛙的那题基本差不多
不一样的地方就在于,这道题目是只要点1,n连接就行,还有这道题是求最大边权和的最小值(通俗来讲就是最大生成树的最小边权)
因此这道题我们在sort的时候就一定要安装边权值从大到小排。
因为吸取了上道题目的经验所以这道题就很简单的ac了。
//Powered by CK
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N1 = 1e3 + 10, N2 = 1e6 + 10;
int fa[N1], n, m, ans;
struct Road {
int x, y, value;
bool operator < (const Road & t) const {//默认的sort都是小于号,这里直接把小于号的的定义反转了,也就相当于大于号
return value > t.value;
}
}road[N2];
void init() {//并查集的初始化操作。
for(int i = 1; i <= n; i++) fa[i] = i;
}
int find(int x) {//查找父节点
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main() {
// freopen("in.txt", "r", stdin);
int t;
scanf("%d", &t);
for(int cas = 1; cas <= t; cas++) {
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
scanf("%d %d %d", &road[i].x, &road[i].y, &road[i].value);
sort(road, road + m);
init();
for(int i = 0; i < m; i++) {
int fx = find(road[i].x);
int fy = find(road[i].y);
if(fx != fy) {
fa[fx] = fy;
ans = road[i].value;
}
if(find(1) == find(n)) break;//这里一定要注意是find(1) == find(n),不能是fa[1] == fa[n]
}
printf("Scenario #%d:\n%d\n\n",cas, ans);
}
return 0;
}