kuangbin专题四 C Heavy Transportation
kuangbin 专题四 最短路练习 POJ 1797 题 C - Heavy Transportation
题目链接:http://poj.org/problem?id=1797
题意:n 个 点 m 个通道 , 从 1 -> n 最少存在一条不同的路径 , 计算 从 1 -> n 所有路径上 权值最小的那条边 权值最大为多少
思路: 最多存在 1000 个点 (肯定不用floyd算法)
可以有 dijksual 算法 改编一下得到目标算法 。
添加新点时 每次添加和 权值最大的边点 ,
用最大的最小权值 维护 新的 从 1 ->未添加点的 距离(直接或者间接)
AC代码:
/*题目大意是就是何处一个图,n个顶点和m条边,每个边都有最大承载量,现在我要从1点运送货物到n点,求能运送货物的最大重量。 对于数据,第一行为t代表测试数据个数,第二行为n和m(意义见上),接着m行,每行三个整数分别是代表一条边的起点, 终点及最大承重量。输出能运送货物的最大重量,格式见样例。注意数据输完后还要再多输一个空行。 对于数据,从1运到3有两种方案 方案1:1-2-3,其中1-2承重为3,2-3承重为5,则可以运送货物的最大重量是3(当大于3时明显1到不了2) 方案2:1-3,可知1-3承重为4,故此路可运送货物的最大重量是4,故答案输出4 */ #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std ; #define len 1005 int map[len][len] ; int t, n , m , Case=0; int dijkstra(){ int visit[len] = {0} ; int d[len] , v ; for(int i=1 ; i<=n ; i++){ // 1号道路和 i 号道路交叉路口的承重 d[i] = map[1][i] ; //d[i] = 0 时代表不相邻 } for(int i =1 ; i<=n ; i++){// 探测 n 个街道 int f=-1 ; for(int j=1; j <= n ; j++){ // 每次从n个街道里面选出承重最大的 if(!visit[j] && d[j] > f ){ f= d[j] ; v = j ; } } visit[v] = 1 ;// 将找到的从1到v最大承重标记 for(int j=1 ; j<=n ; j++){//从找到的路口往下探测 if(!visit[j] && d[j] < min(d[v] , map[v][j])){ // 更新道路 v 与 道路 j 形成的路口 到道路 1 的最大承重 d[j] = min(d[v] , map[v][j]) ; } } } return d[n] ; } int main(){ scanf("%d" , &t) ; while(t--){ scanf("%d%d" , &n , &m) ; // n 条街道 , m 个路口 memset(map , 0 , sizeof(map)) ; // 初始化所有路口承重为零 int a , b , c ; for(int i=1 ; i<=m ; i++){ // m 个路口 scanf("%d%d%d" , &a, &b , &c ) ; map[a][b] = map[b][a] = c ; } printf("Scenario #%d:\n", ++Case) ; printf("%d\n\n" , dijkstra()) ; } return 0 ; }