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 ...
随机推荐
- POJ 3783 Balls --扔鸡蛋问题 经典DP
题目链接 这个问题是谷歌面试题的加强版,面试题问的是100层楼2个鸡蛋最坏扔多少次:传送门. 下面我们来研究下这个题,B个鸡蛋M层楼扔多少次. 题意:给定B (B <= 50) 个一样的球,从 ...
- TensorFlow在windows10上的安装与使用(一)
随着近两年tensorflow越来越火,在一台新win10系统上装tensorflow并记录安装过程.华硕最近的 Geforce 940mx的机子. TensorFlow是一个采用数据流图(data ...
- Rest-Framework组件源码之认证、频率、权限
一:使用RestFramwork,定义一个视图 from rest_framework.viewsets import ModelViewSet class BookView(ModelViewSet ...
- 《区块链100问》第78集:EOS是什么?
EOS是一个区块链开发平台,具有可扩展性强.支持大规模商业应用等特点. 首先,EOS采取DPoS共识算法及其他技术手段预期实现每秒百万级别交易请求,将能够支持数千个商业级的DAPPs. 以太坊是一条公 ...
- PHP验证注册信息
注册页面reg.html <form action="reg.php" method="post"> 用户名<input type=" ...
- 浅析XSS与XSSI异同
浅析XSS与XSSI异同 这篇文章主要介绍了XSS与XSSI异同,跨站脚本(XSS)和跨站脚本包含(XSSI)之间的区别是什么?防御方法有什么不同?感兴趣的小伙伴们可以参考一下 Michael Cob ...
- Strusts2笔记9--防止表单重复提交和注解开发
防止表单重复提交: 用户可能由于各种原因,对表单进行重复提交.Struts2中使用令牌机制防止表单自动提交.以下引用自北京动力节点:
- ADB常用命令(二)
参考 http://adbshell.com/commands 常用命令 查看adb 版本 adb version 打印所有附加模拟器/设备的列表 adb devices 设备序列号 adb get ...
- Access中替代case when的方法 .
最近在做一个用Access的东东,其中用到了case when的方式,但是Access是不支持这种语法的,查询知道IIf和Swith可以作为替代,总结如下: IIf(expr, truepart, f ...
- 浅谈js变量作用域
变量的作用域也是前端面试题常考的一个问题,掌握下面几个规律可以帮你更好的理解js的作用域. 1.作用域优先级遵循就近原则,函数内部的作用域优先级大于外部 var a=456; var b=111; f ...