poj_2253_prim / floyed
来源:互联网 发布:java通过ip获取地区 编辑:程序博客网 时间:2024/06/11 02:33
题目描述:
本题要求得青蛙跳到另一个青蛙石头上所走的路径中,求得在最长步长(每条路径里都有一个最长步长)最短的,那个步长值。出发点1,结束点2。
思路:
法一、利用最小生成树法(Prim),每次选进一个点(从集合S到集合U,选择边最短的链接点),记录的选进的边权最大的那个值,选到2点后推出。//注:这里权值最大的边,必然为通往目标节点2这条路径上的边。
这个思路同迪杰斯特拉,只是这两个算法用的优先序列D[]的意义不同。prim中优先序列存边长,Dijstra中优先序列存从原点到j的路径长。时间复杂度为O(v(logv+E))。
法二、floyed变形。floyed为求每对点的最短距离。改原始存的D[v][w]意义为v->w的所有路径中最长步长的最短步长。三个循环遍历了所有v->w的可能路径。那么在每个循环中,更新D[v][w]= min(D[v][w], max(D[v][u],D[u][w]))。
附:这里代码里的图直接存成邻接矩阵,本题为无向图,也可选择压缩。
//法一:
#include <stdio.h>
#include <stdlib.h>
#define N 201
#define Infinity 10000
typedef struct{
}STONE;
STONE stone[N];
double G[N][N]; //图信息
int final[N];
double D[N];
main()
{