洛谷P1491 集合位置 [最短路,SPFA]
题目描述
每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快。还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法永远是'S'……还有不能忘了,胖子的歌声永远是让我们惊叫的!!
今天是野猫的生日,所以想到这些也正常,只是因为是上学日,没法一起去玩了。但回忆一下那时的甜蜜总是一种幸福嘛。。。
但是每次集合的时候都会出现问题!野猫是公认的“路盲”,野猫自己心里也很清楚,每次都提前出门,但还是经常迟到,这点让大家很是无奈。后来,野猫在每次出门前,都会向花儿咨询一下路径,根据已知的路径中,总算能按时到了。
现在提出这样的一个问题:给出n个点的坐标,其中第一个为野猫的出发位置,最后一个为大家的集合位置,并给出哪些位置点是相连的。野猫从出发点到达集合点,总会挑一条最近的路走,如果野猫没找到最近的路,他就会走第二近的路。请帮野猫求一下这条第二最短路径长度。
输入输出格式
输入格式:
第一行是两个整数n(1<=n<=200)和m,表示一共有n个点和m条路,以下n行每行两个数xi,yi,(-500<=xi,yi<=500),代表第i个点的坐标,再往下的m行每行两个整数pj,qj,(1<=pj,qj<=n),表示两个点相通。
输出格式:
只有一行包含一个数,为第二最短路线的距离(保留两位小数),如果存在多条第一短路径,则答案就是第一最短路径的长度;如果不存在第二最短路径,输出-1。
输入输出样例
说明
各个测试点1s
分析:开始在网上看到了一个Dijkstra算法一次性求最短路和次短路,然后决定来拿这题练手,结果...感人肺腑的卡了两个小时,死活有两个点会wa掉。最后没办法就索性打了个暴力spfa+删边。。。然后之前那个还没调对。。。两份代码都放一下吧。
Code:
(Dijkstra)
#include<bits/stdc++.h>
using namespace std;
const int N=;
#define INF 1e9+7
typedef pair<double,int>P;
int n,m;
double di[N][N],dis[N],dist[N];
struct pos{int x,y;}a[N];
struct node{
int to;double val;
node(int x=,double y=):
to(x),val(y){}};
vector<node>g[N];
void dijkstra()
{
priority_queue<P, vector<P>, greater<P> >team;
fill(dis,dis+n+,INF);
fill(dist,dist+n+,INF);
dis[]=;
team.push(P(,));
while(!team.empty()){
P p=team.top();team.pop();
int x=p.second;
double d=p.first;
if(dist[x]<d)continue;
for(int i=;i<g[x].size();i++){
node e=g[x][i];
double dt=d+e.val;
if(dis[e.to]>dt){
swap(dis[e.to],dt);
team.push(P(dis[e.to],e.to));
}
if(dist[e.to]>dt&&dis[e.to]<dt){
dist[e.to]=dt;
team.push(P(dist[e.to],e.to));
}
}
}
if(dist[n]<dist[])
printf("%.2lf",dist[n]);
else
printf("-1");
}
double get(int A,int B)
{
double x1=a[A].x*1.0,y1=a[A].y*1.0;
double x2=a[B].x*1.0,y2=a[B].y*1.0;
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
scanf("%d%d",&n,&m);
int x,y;
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
di[i][j]=di[j][i]=get(i,j);
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
g[x].push_back(node{y,di[x][y]});
g[y].push_back(node{x,di[y][x]});}
dijkstra();
return ;
}
(SPFA+删边)
#include<bits/stdc++.h>
#define Fi(a,b,c) for(int a=b;a<=c;a++)
#define Fx(a,b,c) for(int a=b;a>=c;a--)
using namespace std;
const int N=;
int n,m,head[N],size,pre[N];
double d[N][N],dis[N],ans;
bool vis[N];
struct Poi{int x,y;}a[N];
struct Node{
int to,next;double val;
}edge[N<<];
inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
inline void add(int x,int y,double z)
{
edge[++size].to=y;
edge[size].val=z;
edge[size].next=head[x];
head[x]=size;
}
inline double get(int x,int y)
{
double x1=a[x].x*1.0,y1=a[x].y*1.0;
double x2=a[y].x*1.0,y2=a[y].y*1.0;
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void spfa()
{
memset(vis,false,sizeof(vis));
Fi(i,,n)dis[i]=0x3f3f3f3f;
queue<int>team;team.push();
dis[]=;vis[]=true;
while(!team.empty()){
int x=team.front();team.pop();vis[x]=false;
for(int i=head[x];i!=-;i=edge[i].next){
int y=edge[i].to;
if(dis[y]>dis[x]+edge[i].val){
dis[y]=dis[x]+edge[i].val;pre[y]=x;
if(!vis[y]){team.push(y);vis[y]=true;}}}}
}
inline double SPFA(int u,int v)
{
memset(vis,false,sizeof(vis));
Fi(i,,n)dis[i]=0x3f3f3f3f;
queue<int>team;team.push();
dis[]=;vis[]=true;
while(!team.empty()){
int x=team.front();team.pop();vis[x]=false;
for(int i=head[x];i!=-;i=edge[i].next){
int y=edge[i].to;if((x==u&&y==v)||(x==v&&y==u))continue;
if(dis[y]>dis[x]+edge[i].val){
dis[y]=dis[x]+edge[i].val;
if(!vis[y]){team.push(y);vis[y]=true;}}}}
return dis[n];
}
int main()
{
n=read();m=read();
memset(head,-,sizeof(head));
Fi(i,,n)a[i].x=read(),a[i].y=read();
Fi(i,,n-) Fi(j,i+,n)
d[i][j]=d[j][i]=get(i,j);
Fi(i,,m){int x=read();int y=read();
add(x,y,d[x][y]);add(y,x,d[y][x]);}
spfa();ans=0x3f3f3f3f;int f=n;
while(){
double ka=SPFA(pre[f],f);
if(ans>ka)ans=ka;f=pre[f];
if(f==)break;}
if(ans>)printf("-1");
else printf("%.2lf",ans);
return ;
}
洛谷P1491 集合位置 [最短路,SPFA]的更多相关文章
- 洛谷 P1491 集合位置
P1491 集合位置 题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的 ...
- 洛谷P1491集合位置
传送门啦 这个题说白了就是求一个次短路. 方法是我们先跑一遍最短路,记录下最短路上每一个点的前驱.然后我们将最短路上每一条边都标记一次,分别跑一边最短路,求出最短路径即可. 在这我们不用特殊判断是否是 ...
- P1491 集合位置 次短路
这个题是一个次短路的裸题,就是把最短路路径求出来之后依次删边,然后跑最短路,在这些情况里取最小值就行了. 题干: 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家 ...
- AC日记——集合位置 洛谷 P1491
集合位置 思路: 次短路: 先走一遍最短路: 记录最短路径,然后依次删边走最短路: 最短的长度就是次短路: 来,上代码: #include <queue> #include <cma ...
- NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
原文链接https://www.cnblogs.com/zhouzhendong/p/9258043.html 题目传送门 - 洛谷P3953 题目传送门 - Vijos P2030 题意 给定一个有 ...
- P1491 集合位置
题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法 ...
- vijos:P1155集合位置(次短路)
描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法永远 ...
- 【题解】洛谷P2296 [NOIP2014TG] 寻找道路(SPFA+DFS)
题目来源:洛谷P2296 思路 一开始看还以为是一道水题 虽然本来就挺水的 本道题的难点在于如何判断是否路径上的点都会直接或者间接连着终点 我们需要在一开始多建一个反向图 然后从终点DFS回去 把路径 ...
- 洛谷 P1466 集合 Subset Sums Label:DP
题目描述 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子 ...
随机推荐
- Axis2 WebService(配置、发布、调用)
准备工作 1.下载:axis2-1.5.4-bin.zip,axis2-1.5.4-war.zip 下载地址:http://axis.apache.org/axis2/java/core/ 2.环境变 ...
- 51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式
1.乘法逆元 直接使用等比数列求和公式,注意使用乘法逆元 ---严谨,失细节毁所有 #include "bits/stdc++.h" using namespace std; #d ...
- 51Nod 1305 Pairwise Sum and Divide | 思维 数学
Output 输出fun(A)的计算结果. Input示例 3 1 4 1 Output示例 4 first try: #include "bits/stdc++.h" using ...
- 持续集成之Jenkins安装部署
1.系统环境和安装java环境 [root@devops ~]# cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) 安装java ...
- ECMAScript5中新增的Array方法实例详解
ECMAScript5标准发布于2009年12月3日,它带来了一些新的,改善现有的Array数组操作的方法.(注意兼容性) 在ES5中,一共有9个Array方法:http://kangax.githu ...
- 【51NOD-0】1058 N的阶乘的长度
[算法]数学 [题解]n!的位数相当于ans=log10(n!)上取整,然后就可以拆出来加了. 可以用log10(i)或log(i)/log(10) 阶乘好像有个斯特林公式…… #include< ...
- java map转json servlet response
1.手写一个map转json的类 1.1 调用方式 //给前端放回json数据 Map<String, Object> map = new HashMap<>(); map.p ...
- python初步学习-pycharm使用 (二)
pycharm调试模式 假设我们的程序在运行过程中命中了一个错误,那我们如何定位错误发生的位置?这就需要进行调试. 在Pycharm中我们可以在其中直接对程序进行调试,唯一需要做的准备工作就是在程序必 ...
- el-date-picker 日期格式化 yyyy-MM-dd
<el-date-picker format="yyyy-MM-dd" v-model="dateValue" type="date" ...
- 空间数据库系列一:geomesa&sparksql 分析环境搭建
geomesa sparksql 分析环境搭建 1.安装hbase-1.3.2.1 standlone版本,作为geomesa的store a.修改配置文件:hbase-1.3.2.1/conf/hb ...