HDU 1598 find the most comfortable road(并查集)

题目链接

解题思路

  一条路上的差值也就是最大值与最小值之差(废话),我们可以枚举最小的边,然后求使其最后连通的最小的边与我们枚举的边的差值的最小值就行了。

代码

const int maxn = 2e2+10;
const int maxm = 1e3+10;
struct E {
    int u, v, w;
} e[maxm];
int n, m, p[maxn];
int find(int x) {
    return p[x]==x ? p[x] : find(p[x]);
}
int main() {
    while(~scanf("%d%d",&n,&m)) {
        for (int i = 0; i<m; ++i) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
        sort(e,e+m,[](E a, E b) {return a.w<b.w;});
        int q; scanf("%d",&q);
        while(q--) {
            int st, ed, ans = INF; scanf("%d%d",&st,&ed);
            for (int i = 0; i<m; ++i) {
                for (int j = 1; j<=n; ++j) p[j] = j;
                for (int k = i; k<m; ++k) {
                    if (find(e[k].u)!=find(e[k].v)) 
                        p[find(e[k].u)] = find(e[k].v);           
                    if (find(st)==find(ed)) {
                        ans = min(ans, e[k].w-e[i].w);
                        break;
                    }
                }
            }
            printf("%d\n", ans==INF?-1:ans);
        }
    }
    return 0;
}
posted @ 2020-05-27 22:32  shuitiangong  阅读(112)  评论(0编辑  收藏  举报