poj-2253-poj-1797_最短路练习
title: poj-2253-poj-1797_最短路练习
date: 2018-11-17 11:48:51
tags:
- acm
- 刷题
categories: - ACM-最短路
概述
一道最短路的变形题,,虽然说解法不止这一种,,
这道题看了好久都没看懂题意,,不知到在求什么,,,最后迫不得已去看了别人的思路,,理清思路之后,,代码就好写了,,,只需在原来的dijkstra板子上改一改就行了,,
补:第二道题和第一道题类似,,再改一改就行了,,
分析与思路
这道题的大致题意就是:给你n块石头的坐标,,然后问你从第一块石头到第二块石头的所有可到的m条路径中,,那m条最长的路中的最小的,,
所以分两步计算,,,
先求 i->j m条路径中每条路径中的最大值,,
然后求这m个最大值中的最小值,,,
按照这个思路,,dijkstra中的松弛条件就要改成
\(dis[v] = min(dis[v] , max(dis[u] , w[u][v]))\)
- dis[v]表示原点1到v的最大路中的最小值,,同理dis[u]也一样
- w[u][v]表示u->v的权值
- 求1->v的最大路中的最小值就等于 之前从别的路径到v中求得的最大路中的最小值 与 1->u->v这条路径中的最大路中的最小值,,(也就是 1->u 中最大路的最小值 和 u->v的权值相比较取最大的) 的最小值
对了,,网上看到的别人的博客大多都是用邻接矩阵实现的,,,然后我尝试用邻接表实现的,,,注意对数据的处理,,,因为是给的点的坐标而不是点的编号,,,所以是每个点之间都有路径,,,最后,,用邻接表是实现记得处理完一组数据要把邻接表清空,,,
还有输出在poj上g++用%.3f
第二道题就是前一道的反过来,,,求所有路径中最小值的最大值,,,
代码
//poj-2253
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 1e3 + 5;
const double inf = 0x3f3f3f3f;
struct node
{
int v;
double c;
node(){}
node(int _v , double _c):v(_v) , c(_c){}
bool operator < (const node &r) const
{
return c > r.c;
}
};
struct edge
{
int v;
double w;
edge(int _v = 0 , double _w = 0):v(_v) , w(_w){}
};
vector<edge> e[maxn];
double dis[maxn];
bool vis[maxn];
int n;
void addedge(int u , int v , double w)
{
e[u].push_back(edge(v , w));
}
void dijkstra()
{
memset(vis , false , sizeof vis);
for(int i = 1; i <= n; ++i)
dis[i] = inf;
dis[1] = 0;
priority_queue<node> q;
while(!q.empty()) q.pop();
q.push(node(1 , 0));
node t;
while(!q.empty())
{
t = q.top();q.pop();
int u = t.v;
if(vis[u]) continue;
vis[u] = true;
for(int i = 0; i < e[u].size(); ++i)
{
int v = e[t.v][i].v;
double w = e[u][i].w;
if(!vis[v])
{
dis[v] = min(dis[v] , max(dis[u] , w));
q.push(node(v , dis[v]));
}
}
}
}
int main()
{
int q = 1;
while(scanf("%d" , &n) != EOF && n)
{
double x[maxn] , y[maxn];
for(int i = 1; i <= n; ++i)
scanf("%lf%lf" , &x[i] , &y[i]);
for(int i = 1; i < n; ++i)
for(int j = i + 1; j <= n; ++j)
{
double w = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
addedge(i , j , w);
addedge(j , i , w);
}
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n" , q++ , dis[2]);
for(int i = 0; i < maxn; ++i)
e[i].clear();
}
}
//1797
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 1e3 + 5;
const int inf = 0x3f3f3f3f;
struct node
{
int v;
int c;
node(){}
node(int _v , int _c):v(_v) , c(_c){}
bool operator < (const node &r) const
{
return c < r.c;
}
};
struct edge
{
int v;
int w;
edge(int _v = 0 , int _w = 0):v(_v) , w(_w){}
};
vector<edge> e[maxn];
int dis[maxn];
bool vis[maxn];
int n , m;
void addedge(int u , int v , int w)
{
e[u].push_back(edge(v , w));
}
void dijkstra()
{
memset(vis , false , sizeof vis);
for(int i = 1; i <= n + 1; ++i)
dis[i] = 0;
dis[1] = inf;
priority_queue<node> q;
while(!q.empty()) q.pop();
q.push(node(1 , inf));
node t;
while(!q.empty())
{
t = q.top();q.pop();
int u = t.v;
if(vis[u]) continue;
vis[u] = true;
for(int i = 0; i < e[u].size(); ++i)
{
int v = e[t.v][i].v;
int w = e[u][i].w;
if(!vis[v])
{
dis[v] = max(dis[v] , min(dis[u] , w));
q.push(node(v , dis[v]));
}
}
}
}
int main()
{
int q = 1;int t;scanf("%d" , &t);
while(t--)
{
scanf("%d%d" , &n , &m);
int u , v , w;
for(int i = 1; i <= m; ++i)
{
scanf("%d%d%d" , &u , &v , &w);
addedge(u , v , w);
addedge(v , u , w);
}
dijkstra();
printf("Scenario #%d:\n%d\n\n" , q++ , dis[n]);
for(int i = 0; i < maxn; ++i)
e[i].clear();
}
}
第二道题思路是对的,,,最后的输出忘记加:wa了4次,,,一直以为是自己的邻接表+优先队列写的有问题,,,emmmmm ,,,坑
小结
因为期中考试等等各种事,,,好久没弄acm的这些东西了,,大概有三周或则一个月了吧,,,
后果就是之前学的,记得东西又快忘记了,,,板子也不能自己的默写下来了QAQ,,
接下来这一个半月得好好的努力一把了,,,,,(逃
(end)
poj-2253-poj-1797_最短路练习的更多相关文章
- POJ 2253 ——Frogger——————【最短路、Dijkstra、最长边最小化】
Frogger Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- POJ 2253 Frogger【最短路变形——路径上最小的最大权】
链接: http://poj.org/problem?id=2253 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- poj 2253 Frogger (最短路变种,连通图的最长边)
题目 这里的dijsktra的变种代码是我看着自己打的,终于把代码和做法思路联系上了,也就是理解了算法——看来手跟着画一遍真的有助于理解. #define _CRT_SECURE_NO_WARNING ...
- POJ 2253 Frogger【最短路变形/最小生成树的最大权/最小瓶颈树/A到B多条路径中的最小的最长边】
Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sit ...
- POJ - 2253 Frogger(最短路Dijkstra or flod)
题意:要从起点的石头跳到终点的石头,设The frog distance为从起点到终点的某一路径中两点间距离的最大值,问在从起点到终点的所有路径中The frog distance的最小值为多少. 分 ...
- POJ 2253 Frogger(最短路&Floyd)题解
题意:想给你公青蛙位置,再给你母青蛙位置,然后给你剩余位置,问你怎么走,公青蛙全力跳的的最远距离最小. 思路:这里不是求最短路径,而是要你找一条路,青蛙走这条路时,对他跳远要求最低.这个思想还是挺好迁 ...
- 最短路(Floyd_Warshall) POJ 2253 Frogger
题目传送门 /* 最短路:Floyd算法模板题 */ #include <cstdio> #include <iostream> #include <algorithm& ...
- poj 2253 Frogger (最长路中的最短路)
链接:poj 2253 题意:给出青蛙A,B和若干石头的坐标,现青蛙A想到青蛙B那,A可通过随意石头到达B, 问从A到B多条路径中的最长边中的最短距离 分析:这题是最短路的变形,曾经求的是路径总长的最 ...
- POJ 2253 Frogger ,poj3660Cow Contest(判断绝对顺序)(最短路,floyed)
POJ 2253 Frogger题目意思就是求所有路径中最大路径中的最小值. #include<iostream> #include<cstdio> #include<s ...
- POJ 2253 Frogger(dijkstra 最短路
POJ 2253 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fion ...
随机推荐
- 回调函数之基本的Promise
在 JavaScript 中,所有的代码都是单线程的,所谓的回调函数就是为了处理一些异步的操作.而多层的回调函数嵌套是一种比较古老的处理方式,这种代码的弊端显而易见,结构混乱.代码冗余,而 Promi ...
- 有用的JavaScript开发小建议
这篇文章将向你分享一些不为人知的但很有用的JavaScript小建议,对那些刚涉及使用JavaScript编程语言的初级开发者应该有很大的帮助. 1. 用数组长度截取数组 我们都知道,对象都是通过使用 ...
- HDU 4639 hehe 杭电2013多校联赛第四场1008题
解题报告:题目的意思是输入一个字符串,并规定,里面的“hehe”可以用"wqnmlgb"来代替,也可以不代替,问输入的这个字符串在经过相关的代替之后可以有多少种不同的形态.先打一个 ...
- 【译】第十二篇 SQL Server代理多服务器管理
本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...
- 20155303 2016-2017-2 《Java程序设计》第九周学习总结
20155303 2016-2017-2 <Java程序设计>第九周学习总结 目录 学习内容总结(Linux命令) 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考 ...
- ASM配置OGG
两种方法:http://blog.sina.com.cn/s/blog_aa84cfe40101lsks.html 使用ACFS配置OGG:http://ylw6006.blog.51cto.com/ ...
- cvpr densnet论文
- html元素分类
目录 块级元素 内联元素 内联块级元素 总结 一.块级元素(block) 定义:默认情况下,独占一行的元素就是块级元素. 特点: 每个块级元素都从新的一行开始,并且其后的元素也另起一行.(真霸道,一 ...
- iconfont-矢量图标字体
二.矢量图标使用 1.进入:http://www.iconfont.cn/ 搜索你图标的关键字,然后将需要的图标字体加入购物车 加入购物车之后,添加到项目 2.点击查看在线连接,生成css代码,把代 ...
- java基础23 Math类和Random类
一.Math数学类 主要是提供很多数学的公式 1.1.Math类的常用方法 abs(int a):绝对值 ceil(double a):向上取整 floor(double a):向下取整 ...