博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku 2253 Frogger 第一周训练——最短路
阅读量:5260 次
发布时间:2019-06-14

本文共 3605 字,大约阅读时间需要 12 分钟。

这道题的提议就是就最小生成树中的最大权所以我用了最小生成树prim算法

View Code
#include 
#include
#include
#include
#define maxn 207 using namespace std; const double inf = 99999999.0; bool vt[maxn]; double dis[maxn],map[maxn][maxn]; struct node {
double x,y; }tagp[maxn]; int n; double ans; void init() {
int i,j; for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
if (i == j) map[i][j] = 0; else map[i][j] = inf; } } } double length(int i,int j) {
double x = tagp[i].x - tagp[j].x; double y = tagp[i].y - tagp[j].y; double s = sqrt(x*x + y*y); return s; } void prim() {
int i,j,k; double min; ans = 0.0; for (i = 0; i < n; ++i) {
vt[i] = false; dis[i] = map[0][i]; } vt[0] = true; for (k = 1; k < n; ++k) {
j = 0; min = inf; for (i = 1; i < n; ++i) {
if (!vt[i] && dis[i] < min) {
j = i; min = dis[i]; } } vt[j] = true; if (ans < min) ans = min; if (j == 1) break; for (i = 1; i < n; ++i) {
if (!vt[i] && dis[i] > map[i][j]) dis[i] = map[i][j]; } } } int main() {
int i,j,cas = 1; while (~scanf("%d",&n)) {
if (!n) break; init(); for (i = 0; i < n; ++i) {
cin>>tagp[i].x>>tagp[i].y; } for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
map[i][j] = length(i,j); } } prim(); printf("Scenario #%d\n",cas++); printf("Frog Distance = %.3lf\n\n",ans); } return 0; }

这道题可以是Dijkstra算法的变形,原来Dijkstra求最短时dis[i]里面存的是到起点的最短距离,而现在则是存由起点到i的最短路径里面的最大边权值了。。

View Code
#include 
#include
#include
#include
#define maxn 207 using namespace std; double dis[maxn],map[maxn][maxn]; bool vt[maxn]; int n; const double inf = 9999999.0; struct node {
double x,y; }p[maxn]; double Max(double a,double b) {
return a > b ? a:b; } double Min(double a,double b) {
return a < b ? a:b; } void init() {
int i,j; for (i = 0; i < n; ++i) {
vt[i] = false; for (j = 0; j < n; ++j) {
if (i == j) map[i][j] = 0; else map[i][j] = inf; } } } double length(int i,int j) {
double x = p[i].x - p[j].x; double y = p[i].y - p[j].y; double s = 1.0*sqrt(x*x + y*y); return s; } void Dijkstra() {
int i,j,k; double min; for (i = 0; i < n; ++i) {
dis[i] = map[0][i]; } vt[0] = true;; for (k = 1; k < n; ++k) {
j = 0; min = inf; for (i = 1; i < n; ++i) {
if (!vt[i] && dis[i] < min) {
j = i; min = dis[i]; } } vt[j] = true; for (i = 0; i < n; ++i) {
if (!vt[i]) {
dis[i] = Min(dis[i],Max(map[i][j],dis[j]));//关键的改进是在这里,Min是确保最短路径 //Max是求边权值最大。。 } } } } int main() {
int i,j,cas = 1; while (~scanf("%d",&n)) {
if (!n) break; init(); for (i = 0; i < n; ++i) {
cin>>p[i].x>>p[i].y; } for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
map[i][j] = map[j][i] = length(i,j); } } Dijkstra(); printf("Scenario #%d\n",cas++); printf("Frog Distance = %.3lf\n\n",dis[1]); } return 0; }

转载于:https://www.cnblogs.com/E-star/archive/2012/03/08/2384510.html

你可能感兴趣的文章
poj 2686 Traveling by Stagecoach
查看>>
为html设置100%,body 设置100% 出现滚动条的问题
查看>>
linux下WPS的使用
查看>>
java 中 finally里面写了return 会发生什么?
查看>>
Web Api 利用 cors 实现跨域
查看>>
hdu 3938 并查集
查看>>
谈谈hashcode和equals的用法
查看>>
instanceof
查看>>
BZOJ 题目1036: [ZJOI2008]树的统计Count(Link Cut Tree,改动点权求两个最大值和最大值)...
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
Excellent Strategies to Expand Clients
查看>>
【原创】Django-ORM基础
查看>>
mysql常用操作命令收集
查看>>
网络穿透
查看>>
2015/8/4 告别飞思卡尔,抛下包袱上路
查看>>
软件开发与模型
查看>>
Codeforces Round #306 (Div. 2) A
查看>>
ASP.NET 5 将于2016年一季度公布
查看>>
Objective-C sortUsingSelector方法
查看>>