POJ 3615 Cow Hurdles(Folyd变形)
http://poj.org/problem?id=3615
题意:
给你一个有向图,然后对于特定的点A与B,要你求出A到B之间所有可行路径的单段路距离最大值的最小值.(有点绕)
分析:
剥除floyd的外壳,本题d[i][j]表示的是从i到j的所有路径中单段路距离最大值的最小值。所以其实本题还是依据动态规划的思想来做的,这里
d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));
当不同类d[i][k]和d[k][j]合并的时候,取得是max(最大值,因为我们要求i到j这段路内的最大值)。然后当同类路径值(即两个d[i][j]可行值)选优时,取得是最小值(因为我们要求所有i到j路径目的值中的最小值)。
(仔细体会上面分析,以后凡是最大值中的最小值 或 最小值中的最大值 DP问题都可以用类似思想解决)
AC代码:
#include<cstdio>
#include<algorithm>
#define INF 1e9
using namespace std;
const int maxn = 300+10;
int n,m,t;
int d[maxn][maxn];
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(d[i][k]<INF &&d[k][j]<INF)
d[i][j]=min(d[i][j],max(d[i][k],d[k][j]));
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)==3)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]= i==j?0:INF;
for(int i=1;i<=m;i++)
{
int u,v,height;
scanf("%d%d%d",&u,&v,&height);
d[u][v]=height;
}
floyd();
while(t--)
{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",d[u][v]==INF?-1:d[u][v]);
}
}
return 0;
}

本文解析了POJ3615 CowHurdles问题,通过Floyd算法变形解决最大值中的最小值问题。介绍了如何利用动态规划思想更新节点间路径的最大值,并实现代码。

923

被折叠的 条评论
为什么被折叠?



