Poj3662 Telephone Lines (限制最短路)

来源:互联网 发布:工作日志管理系统源码 编辑:程序博客网 时间:2024/05/24 07:07

题目链接:http://poj.org/problem?id=3662

 

题目抽象:给出一个无向图,一个起点1和终点N,求满足1到N的路径上第k-1大的边最小的一条路径,并输出这条边的长度.

 

此题有两种做法:

 

第一种是二分结果,把求解问题变为判定问题,如果当前结果满足条件,就把结果下移,一直找到最优为止;判定的时候可以把大于预设花费的边设为1,小于的边设为0,这样的话就转化成了另一个图,在这个图上求最短路,则可知路径上长度等于预设花费的边的个数,如果长度不大于K,则满足条件,即可以使最终花费控制在预设花费之下;

 

第二种方法是增添状态表示当前行程的情况,用U表示到达的点,用KK表示到达该点时使用了的免费边的个数,这样从一点到与之相邻接的下一点就分为两种情况:使用当前边的花费 或 把当前边设为要免费的边 ,

 

这样的话式子就可以表示为

 

d[v][kk]=max(e->d,d[v][kk]);

d[v][kk+1]=d[v][kk];

 

看到一本书上把与之相似的处理称作增点:即 

增加点 v=u*MAXN+k;

这样就可以把二维的Dij映射到了一维的Dij上,不过要注意状态的转化

 

代码:

(二分)

 

 

(二维Dijkstra)