poj1797 Heavy Transportation (Kruskal 算法)

Heavy Transportation

Time Limit: 3000MS   Memory Limit: 30000K
Total Submissions: 22796   Accepted: 6053

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
output for every scenario begins with a line containing "Scenario #i:",
where i is the number of the scenario starting at 1. Then print a
single line containing the maximum allowed weight that Hugo can
transport to the customer. Terminate the output for the scenario with a
blank line.

Sample Input

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

Sample Output

Scenario #1:
4
水水水、、、恩,就是求能从1-n的路径的最小边的最大值嘛,,,嘛嘛,,,虽然感觉用这个算法解决的问题,差不多就是用并查集就能够解决oooo。。。不过这个解法确实很巧妙诶,,,

#include<stdio.h>#include<algorithm>using namespace std;

struct Edge{    int u,v,w;};Edge e[1000005];int p[1005];int r[1005];

bool cmp(Edge e1,Edge e2){    return e1.w>e2.w;}

//并查集部分int find(int u){    if(u!=p[u]){        p[u]=find(p[u]);    }    return p[u];}void join(int u,int v){    int a=find(u);    int b=find(b);    if(a==b){        return ;    }    if(r[a]>r[b]){        p[b]=a;    }    else if(r[a]<r[b]){        p[a]=b;    }    else{        p[a]=b;        r[b]++;    }}void init(int n){    for(int i=1;i<=n;i++){        p[i]=i;        r[i]=i;    }}

int main(){    int t;    scanf("%d",&t);    int casee=1;    while(t--){        int n,m;        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+n,cmp);        int res;        for(int i=0;i<m;i++){            if(find[1]==find[n]){                break;            }//判断此时1-n的路是否已经连通            int u=e[i].u;            int v=e[i].v;            if(find[u]!=find[v]){                res=e[i].w;                join(u,v);            }//如果现在这条边的两个点不在同一个集合中,才加到并查集里面去,否则就不        }//因为已经按权值由大到小排好序了嘛,现在的res值就一定是始它能连通的时候的最大权值了。。。        printf("Scenario #%d:\n%d\n\n",casee,res);        casee++;    }    return 0;}
时间: 2024-10-06 18:57:09

poj1797 Heavy Transportation (Kruskal 算法)的相关文章

POJ-1797 Heavy Transportation(最大生成树)

Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 39963   Accepted: 10507 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man

POJ1797 Heavy Transportation 【Dijkstra】

Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 21037   Accepted: 5569 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man

poj1797——Heavy Transportation(最大生成树)

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 t

POJ1797 Heavy Transportation

解题思路:典型的Kruskal,不能用floyed(会超时),上代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define inf 0x3f3f3f3f 6 const int maxn = 1005; 7 int father[maxn]; 8 9 struct node{ 10 int x, y, w; 11 }p[maxn*max

POJ1797 Heavy Transportation (堆优化的Dijkstra变形)

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

poj1797 - Heavy Transportation(最大边,最短路变形spfa)

题目大意: 给你以T, 代表T组测试数据,一个n代表有n个点, 一个m代表有m条边, 每条边有三个参数,a,b,c表示从a到b的这条路上最大的承受重量是c, 让你找出一条线路,要求这条线路上的最大的承重, 在所有其他线路最小. 题目分析: 这里只要将spfa进行一下变形就可以解决这问题了. 首先 我们的dist数组,起点位置要初始化为 INF, 其他位置初始化为 0 然后我们更新 dist 数组, 结果输出 dist[n]就行了 为什么这样写: 因为我们每次要找 所有路径中的最大边的最小一个,

poj1797 Heavy Transportation(最短路变形)

题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 解题思路:其实这个求最大边可以近似于求最短路,只要修改下找最短路更新的条件就可以了 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn=1010; const int INF=0x3f3f3f3

POJ 1797 Heavy Transportation(二分+并查集/kruskal)

Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 24398   Accepted: 6472 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man

POJ 1979 Heavy Transportation (kruskal)

Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions:46898   Accepted: 12204 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man