【洛谷P1491】集合位置
题目大意:求给定的一张无向带权图的次短路。
题解:先跑一遍 spfa 求出从起点到终点的最短路,记录路径。接着枚举删边,并重新跑 spfa,统计最小值即可。
至于为什么 dp 做法不行,暂时还不清楚。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxe=2e4+10;
const int maxv=210;
const double inf=0x3f3f3f3f;
struct node{
int nxt,to;
double w;
}e[maxe<<1];
int tot=1,head[maxv];
inline void add_edge(int from,int to,double w){
e[++tot]=node{head[from],to,w},head[from]=tot;
}
int n,m,pre[maxv];
double x[maxv],y[maxv],d[maxv],ans=inf;
bool in[maxv];
inline double calc(int a,int b){
return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
}
void read_and_parse(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);
for(int i=1,a,b;i<=m;i++){
scanf("%d%d",&a,&b);
double c=calc(a,b);
add_edge(a,b,c),add_edge(b,a,c);
}
}
queue<int> q;
void spfa(int a,int b){
memset(in,0,sizeof(in));
fill(d+1,d+n+1,inf);
q.push(1),in[1]=1,d[1]=0;
while(q.size()){
int u=q.front();q.pop(),in[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;double w=e[i].w;
if((u==a&&v==b)||(v==a&&u==b))continue;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(a==-1&&b==-1)pre[v]=u;
if(!in[v])q.push(v),in[v]=1;
}
}
}
}
void solve(){
spfa(-1,-1);
for(int i=n;pre[i];i=pre[i]){
spfa(i,pre[i]);
ans=min(ans,d[n]);
}
if(ans==inf)puts("-1");
else printf("%.2lf\n",ans);
}
int main(){
read_and_parse();
solve();
return 0;
}
【洛谷P1491】集合位置的更多相关文章
- 洛谷 P1491 集合位置
P1491 集合位置 题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的 ...
- 洛谷P1491 集合位置 [最短路,SPFA]
题目传送门 题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记 ...
- 洛谷P1491集合位置
传送门啦 这个题说白了就是求一个次短路. 方法是我们先跑一遍最短路,记录下最短路上每一个点的前驱.然后我们将最短路上每一条边都标记一次,分别跑一边最短路,求出最短路径即可. 在这我们不用特殊判断是否是 ...
- AC日记——集合位置 洛谷 P1491
集合位置 思路: 次短路: 先走一遍最短路: 记录最短路径,然后依次删边走最短路: 最短的长度就是次短路: 来,上代码: #include <queue> #include <cma ...
- 洛谷 P1466 集合 Subset Sums Label:DP
题目描述 对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的.举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,每个子 ...
- 洛谷P1466 集合 Subset Sums
P1466 集合 Subset Sums 162通过 308提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 对于从1到N (1 ...
- P1491 集合位置
题目描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法 ...
- P1491 集合位置 次短路
这个题是一个次短路的裸题,就是把最短路路径求出来之后依次删边,然后跑最短路,在这些情况里取最小值就行了. 题干: 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家 ...
- 洛谷 P2415 集合求和【数学公式/模拟】
给定一个集合s(集合元素数量<=30),求出此集合所有子集元素之和. 输入输出格式 输入格式: 集合中的元素(元素<=1000) 输出格式: 和 输入输出样例 输入样例#1: 2 3 输出 ...
随机推荐
- 20155207 《网络对抗技术》EXP3 免杀原理与实践
20155207 <网络对抗技术>EXP3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? - 根据特征码进行检测(静态) - 启发式(模糊特征点.行为 ) - 根据行为进行检 ...
- 20155217《网络对抗》Exp04 恶意代码分析
20155217<网络对抗>Exp04 恶意代码分析 实践内容 使用schtasks指令监控系统运行 使用sysmon工具监控系统运行 使用virscan分析恶意软件 使用systrace ...
- 20155307《网络对抗》MSF基础应用
实验过程 实验系统 所需设备: 靶机1:Windows XP Professional SP2 ,IP地址:192.168.1.128 靶机2:Windows XP Professional SP3 ...
- mfc 类型间的强制转换
一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行 ...
- EAS_BI(扩展报表)
case when 的使用 1. 扩展报表,一张收费单据中,下面分为分录 问题描述: 收费单中有一个分录用于记录检测的项目名称以及标准费用.收费单有自己的主键,分录中的外键即是收费单的主键,然后分录表 ...
- metasploit-smb扫描获取系统信息
1.msfconsle 2.use auxiliary/scanner/smb/smb_version 3. msf auxiliary(smb_version) > set RHOSTS 17 ...
- C# LINQ to XML示例
static void Main(string[] args) { // Create the data source by using a collection initial ...
- LeetCode Generate Parentheses (DFS)
题意 Given n pairs of parentheses, write a function to generate all combinations of well-formed parent ...
- vue项目eslint配置 以及 解释
// https://eslint.org/docs/user-guide/configuring module.exports = { root: true, parserOptions: { pa ...
- gym101522 [小熊骑士限定]La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017
西瓜队(划掉),Kuma Rider久违的第一场训练,四小时瞎打.jpg A.水题,排序 #include<cstdio> #include<iostream> #includ ...