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 ...
随机推荐
- CPU字节序
小端存储:低对低,高对高(低位存储在低地址,高位存储在高地址) 大端存储:低对高,高对低(低位存储在高地址,高位存储在低地址) 小端字节序: x86体系结构,arm指令只支持小端,数据支持大小端 ...
- 20155322 2016-2017-2 《Java程序设计》第7周学习总结
20155322 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 第七周学习的主要内容是课本的第十二第十三章: 第十二章主要内容: "Lambda ...
- J - Borg Maze +getchar 的使用注意(二维字符数组的输入)
题目链接: https://vjudge.net/contest/66965#problem/J 具体思路: 首先将每个点之间的最短距离求出(bfs),A 或者 S作为起点跑bfs,这样最短距离就求出 ...
- Windows执行命令与下载文件总结
1.前言 在渗透或是病毒分析总是会遇到很多千奇百怪的下载文件和执行命令的方法. 2.实现方式 2.1.Powershell win2003.winXP不支持 $client = new-object ...
- 企业日志大数据分析系统ELK+KAFKA实现【转】
背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项:所以最近将Redis ...
- C# 链接webservice报错
未处理 System.ServiceModel.EndpointNotFoundException Message="没有终结点对可能接受消息的 http://192.168.0.168/ ...
- vs2010,vs2012注释快捷键
注释:VS2010是(Ctrl+E,C),VS2012是(Ctrl+K, Ctrl+C) 反注释:VS2010是(Ctrl+E,U),VS2012是(Ctrl+K, Ctrl+U)
- SSD固态硬盘检测工具AS SSD参数
一. 使用AS SSD Benchmark进行查看 包括了4个方面的测试(顺序读写.4K随机读写.64线程4K读写.寻道时间) AS SSD的主要测试,也是网上最常见得到测试成绩的,是它主界面上持续. ...
- Java 并发--线程创建
随着处理器的多核化,为提高处理器的资源利用率应用程序的并发变应运而生了.现在的操作系统是多任务操作系统,多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的内存空间 ...
- DevExpress GridControl 的数据绑定
本人不才啊,折腾2个多小时才把数据绑定好.现在把折腾过程记录一下来以帮助更多的朋友,自己也温习一下. 直接上代码了哈.... WPF哈 xaml文件 <dxg:GridControl Name= ...