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;
}
posted @ 2020-01-03 10:34  lifehappy  阅读(128)  评论(0编辑  收藏  举报