题目链接:POJ 1797

Description

Background

Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to the place where it is needed on which all streets can carry the weight.

Fortunately he already has a plan of the city with all streets and bridges and all the allowed weights.Unfortunately he has no idea how to find the the maximum weight capacity in order to tell his customer how heavy the crane may become. But you surely know.

Problem

You are given the plan of the city, described by the streets (with weight limits) between the crossings, which are numbered from 1 to n. Your task is to find the maximum weight that can be transported from crossing 1 (Hugo's place) to crossing n (the customer's place). You may assume that there is at least one path. All streets can be travelled in both directions.

Input

The first line contains the number of scenarios (city plans). For each city the number n of street crossings (1 <= n <= 1000) and number m of streets are given on the first line. The following m lines contain triples of integers specifying start and end crossing of the street and the maximum allowed weight, which is positive and not larger than 1000000. There will be at most one street between each pair of crossings.

Output

The first line contains the number of scenarios (city plans). For each city the number n of street crossings (1 <= n <= 1000) and number m of streets are given on the first line. The following m lines contain triples of integers specifying start and end crossing of the street and the maximum allowed weight, which is positive and not larger than 1000000. There will be at most one street between each pair of crossings.

Sample Input

1
3 3
1 2 3
1 3 4
2 3 5

Sample Output

Scenario #1:
4

Source

TUD Programming Contest 2004, Darmstadt, Germany

Solution

题意

有 N 个城市,M 条道路,Hugo Heavy 要从城市 1 到城市 N 运输货物,每条道路都有它的最大载重量,求从城市 1 到城市 N 运送最多的重量是多少。

思路

最大生成树

题目要求点 1 到 N 的所有路径的所有边权的最小值中的最大值。维护一个最大生成树,不断将最大权值的边加入,如果遇到点 N 就结束。

这题有点坑,输出两个换行。

此题还可以用 \(Dijkstra\) 解决。戳这里

Code

Prim

#include <iostream>
#include <cstdio>
#include <queue>
#include <map>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
const int inf = 0x3f3f3f3f;
typedef pair<int, int> P;
int n, m;
int ans; struct Edge {
int to, w;
Edge(int to, int w): to(to), w(w) {}
};
vector<Edge> G[N];
int d[N], v[N]; void init() {
for(int i = 0; i < N; ++i) {
G[i].clear();
}
ans = inf;
} void add(int x, int y, int z) {
G[x].push_back(Edge(y, z));
} void prim(int s) {
priority_queue<P> q;
memset(d, 0, sizeof(d));
memset(v, 0, sizeof(v));
d[s] = inf;
q.push(P(inf, s));
while(q.size()) {
P p = q.top(); q.pop();
int x = p.second;
if(v[x]) continue;
v[x] = 1;
ans = min(ans, p.first);
if(x == n) return;
for(int i = 0; i < G[x].size(); ++i) {
Edge e = G[x][i];
if (d[e.to] < e.w && !v[e.to]) {
d[e.to] = e.w;
q.push(P(d[e.to], e.to));
}
}
}
} int main() {
int T;
scanf("%d", &T);
int kase = 0;
while(T--) {
init();
scanf("%d%d", &n, &m);
for(int i = 0; i < m; ++i) {
int x, y, z;
scanf("%d%d%d", &x, & y, &z);
add(x, y, z);
add(y, x, z);
}
prim(1);
if(kase) printf("\n");
printf("Scenario #%d:\n", ++kase);
printf("%d\n", ans);
}
return 0;
}

Kruskal

#include <iostream>
#include <cstdio>
#include <queue>
#include <map>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010, M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
int n, m;
int ans; struct Edge {
int x, y, z;
} edge[M]; int fa[N]; int cmp(Edge a, Edge b) {
return a.z > b.z;
} int get(int x) {
if(x == fa[x]) return x;
return fa[x] = get(fa[x]);
} void init() {
for(int i = 0; i <= n; ++i) {
fa[i] = i;
}
ans = inf;
} void kruskal() {
sort(edge + 1, edge + 1 + m, cmp);
for(int i = 1; i <= m; ++i) {
int x = get(edge[i].x);
int y = get(edge[i].y);
if(x != y) {
ans = min(ans, edge[i].z);
fa[x] = y;
}
x = get(1);
y = get(n);
if(x == y) return;
}
} int main() {
int T;
scanf("%d", &T);
int kase = 0;
while(T--) {
scanf("%d%d", &n, &m);
init();
for(int i = 1; i <= m; ++i) {
scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].z);
}
kruskal();
if(kase) printf("\n");
printf("Scenario #%d:\n", ++kase);
printf("%d\n", ans);
}
return 0;
}

POJ 1797 Heavy Transportation (最大生成树)的更多相关文章

  1. poj 1797 Heavy Transportation(最大生成树)

    poj 1797 Heavy Transportation Description Background Hugo Heavy is happy. After the breakdown of the ...

  2. POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径)

    POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径) Description Background Hugo ...

  3. POJ.1797 Heavy Transportation (Dijkstra变形)

    POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...

  4. POJ 1797 Heavy Transportation

    题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K T ...

  5. POJ 1797 Heavy Transportation SPFA变形

    原题链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K T ...

  6. POJ 1797 Heavy Transportation(最大生成树/最短路变形)

    传送门 Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 31882   Accept ...

  7. POJ 1797 Heavy Transportation (Dijkstra变形)

    F - Heavy Transportation Time Limit:3000MS     Memory Limit:30000KB     64bit IO Format:%I64d & ...

  8. POJ 1797 ——Heavy Transportation——————【最短路、Dijkstra、最短边最大化】

    Heavy Transportation Time Limit:3000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64 ...

  9. POJ 1797 Heavy Transportation (Dijkstra)

    题目链接:POJ 1797 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter pro ...

随机推荐

  1. 测开之路十六:@classmethod与@staticmethod

    @classmethod 类方法 和属性一样,所有实例化的对象都共享类方法 @staticmethod 静态方法,可以理解为和类没有任何关系,只是放在了类里面 参数可以任意定义,根据自己的定义传参,也 ...

  2. Python多进程编程-进程间协作(Queue、Lock、Semaphore、Event、Pipe)

    进程与进程之间是相互独立的,互不干扰.如果多进程之间需要对同一资源操作,就需要进程间共享变量,上一篇文章介绍了进程间共享数据的三大类Value.Array.Manager,这三种类的主要区别在于管理的 ...

  3. taintCheck的实现

    参考:http://bitblaze.cs.berkeley.edu/papers/taintcheck-full.pdf 1. 应用taint analysis需要解决三个问题 a. 哪些input ...

  4. equals方法重写

    在java中常见的equals方法的重写: 举例:一个自定义类ball如下 public class Ball { private String name; private int weight; p ...

  5. 洛谷 P1462 通往奥格瑞玛的道路——二分+spfa

    上一波链接 https://www.luogu.org/problem/P1462 这道题我们考虑二分答案 然后每次跑一次spfa判断是否能够到达n点 tips:在不考虑负权边的前提下我们写最短路最好 ...

  6. hashlib加密模块,加密方式:(MD5,sha级别)

    三,hashlib模块 算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一 ...

  7. nuxt+高德地图实现多边形区域检索

    我已经放弃百度地图了,为什么呢? 原因一: 百度地图api太乱不容易查阅 原因二: 百度给出的案例太少,可参考项太少 第三点也是最重要的,百度地图花钱,百度地图花钱,百度地图花钱, 很荣幸,作为国内唯 ...

  8. opensns建站

    opensns建站 标签(空格分隔):软件工程 贪玩蓝月 购买云服务器 首选阿里云,一个月9.9元,还能直接安全宝塔Linux界面 后台初始化 输入ip地址:8888访问宝塔后台,第一次进入后台会让你 ...

  9. 2019-9-2-win10-uwp-颜色转换

    title author date CreateTime categories win10 uwp 颜色转换 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 1 ...

  10. 一、Redis的安装

    1.下载.解压.编译.安装 # 下载地址 wget http://download.redis.io/redis-stable.tar.gz # 解压 tar xzf redis-stable.tar ...