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 ...
随机推荐
- 实现asp.net的文件压缩、解压、下载
很早前就想做文件的解压.压缩.下载 了,不过一直没时间,现在项目做完了,今天弄了下.不过解压,压缩的方法还是看的网上的,嘻嘻~~不过我把它们综合了一下哦.呵呵~~ 1.先要从网上下载一个icsharp ...
- 基本控件文档-UISlider属性
CHENYILONG Blog 基本控件文档-UISlider属性 Fullscreen UISlide属性技术博客http://www.cnblogs.com/ChenYilong/ 新浪微 ...
- Dream------Hadoop--FSDataInputStream和FSDataOutputStream
一.FSDataInputStream FileSystem中的open()方法实际上返回的是一个FSDataInputStream,而不是标准的java.io类.这个类是java.io.Dat ...
- quartz的一个误导
quartz文档提到,如果在集群环境下,最好将配置项org.quartz.jobStore.txIsolationLevelSerializable设置为true 问题: 这个选项在mysql下会非常 ...
- 使用脚本实现killproc的功能
在shell提示符号下输入type killproc,会发现killproc实在 /sbin/目录下,通过man killproc可以查看这个脚本(姑且这么称为脚本)的用法,现在,把这个脚本的实现过程 ...
- mysqlbinlog的日志类型
一.mysqlbinlog简介 binlog又叫二进制日志文件,它会将mysql中所有修改数据库数据的Query以二进制的形式记录到日志文件中,如:create,insert,drop,update等 ...
- urllib2使用初探
在入门urllib2之前,我想应该先调研一下urllib与urllib2的区别[1].首先我们要明白的是,这两个模块不可以相互替代.两者都是接受URL请求的模块,但是提供了不同的功能,两个显著的区别是 ...
- C语言位域——精妙使用内存
参考链接 https://blog.csdn.net/yanbober/article/details/8697967 https://blog.csdn.net/Tommy_wxie/artic ...
- android解决AVD中文路径无法启动问题
在as中新建一个AVD,然而启动时却报错,总之是不能找到中文路径 然后这个虚拟设备被默认安装在了C盘我的用户李敏啊,而我用户名是中文名导致无法识别 解决办法,使用链接文件格式修改虚拟设备配置路径, 比 ...
- 再谈OPENCV(转)
转自:http://blog.csdn.net/carson2005/article/details/6979806 尽管之前写过一篇关于OpenCV的介绍(http://blog.csdn.net/ ...