zoukankan      html  css  js  c++  java
  • 【最短路/最大生成树】POJ 1797 Heavy Transportation

    POJ 1797 Heavy Transportation

    题意:给一个无向图,找出在所有从结点(1)到结点(n)的路径中,最小边的权值最大的那一条。输出这个权值。

    思路:

    方法有两种:一是最短路变形,二是最大生成树。

    这里先给出最大生成树的代码。最大生成树可以保证生成“最小边的权值最大的那一条路径”,又因为在生成过程中,边的权值顺序是从大到小的,所以能使结点(1)到结点(n)连通的最后那一条边就是题目所求的“最小边”。只要结点(1)到结点(n)有通路就可以跳出,不要生成整棵树。

    注意这里在结构体Edge中重载了<运算符,规定权值较大的边比较小。而sort函数是默认从小到大排的,sort之后边的顺序其实是按权值从大到小。

    int n, m;
    int p[maxn];
    
    int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); }
    
    struct Edge {
    	int from, to;
    	LL dis;
    	bool operator < (const Edge& t) const { return dis > t.dis; }
    }Edges[maxn * maxn];
    
    void solve() {
    	n = read(); m = read();
    	for (int i = 0; i <= n; i++) p[i] = i;
    
    	int ans = 0;
    	for (int i = 1; i <= m; i++) {
    		int u, v;
    		LL d;
    		u = read(); v = read(); d = read();
    		Edges[i].from = u;
    		Edges[i].to = v;
    		Edges[i].dis = d;
    	}
    	sort(Edges + 1, Edges + 1 + m);
    	for(int i=1;i<=m;i++) {
    		Edge& e = Edges[i];
    		int x = find(e.from);
    		int y = find(e.to);
    		if (find(1) != find(n)) {
    			ans = e.dis;
    			p[x] = y;
    		}
    		else break;
    	}
    	cout << ans << endl << endl;
    }
    
  • 相关阅读:
    工业设计之美
    狠挖用户需求与用户分析——赫志中
    《必然》
    在一周内学会使用 AUTO CAD
    可控硅调光知识总结
    PADS Logic Decal、Layout Decal绘制
    BUCK-BOOST反激变压器设计
    RCC BUCK-BOOST变压器设计
    产品生产
    由《旧制度与大革命》提取的5个感触
  • 原文地址:https://www.cnblogs.com/streamazure/p/12941864.html
Copyright © 2011-2022 走看看