poj 1797 最大最小容量dijkstra (经典)
Posted 00isok
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1797 最大最小容量dijkstra (经典)相关的知识,希望对你有一定的参考价值。
<题目链接>
题目大意:
Hugo Heavy要从城市1到城市N运送货物,有M条道路,每条道路都有它的最大载重量,问从城市1到城市N运送最多的重量是多少。
解题分析:
感觉这道题用dijkstra不是很好想,有点抽象。我反而觉得这道题用最大流比较好想,比如EK算法,用BFS求出所有1->n的增广路径,然后求出每条增广路径的最小值,就可最终得到这些最小值中的最大值。
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; #define MAXV 1010 #define INF 0x3f3f3f3f int map[MAXV][MAXV],n,m; int dijkstra(){ int vis[MAXV],d[MAXV],i,j,v; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++){ //注意这个初始化 d[i]=map[1][i];` } int cur=1; for(int i=1;i<=n;i++){ vis[cur]=1; for(int j=1;j<=n;j++){ if(!vis[j]&&d[j]<min(d[cur],map[cur][j])){ //仔细揣摩这里,本题的关键 d[j]=min(d[cur],map[cur][j]); } } int cal=-INF,loc=-1; for(int j=1;j<=n;j++){ if(!vis[j]&&d[j]>cal){ loc=j; cal=d[j]; } } cur=loc; } return d[n]; } int main(){ int t,i,j,kcase,a,b,c; scanf("%d",&kcase); for(t=1;t<=kcase;t++) { scanf("%d %d",&n,&m); memset(map,0,sizeof(map)); for(i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } printf("Scenario #%d: ",t); printf("%d ",dijkstra()); } return 0; }
2018-08-15
以上是关于poj 1797 最大最小容量dijkstra (经典)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 1797 Heavy Transportation (Dijkstra)
POJ1797:Heavy Transportation(改造Dijkstra)
POJ 1797 Heavy Transportation(Dijkstra运用)