和天梯中的直捣黄龙差不多。但是,通过这个问题,我对多参数最短路又有了更深一层的了解。

  这题因为点数比较多,所以如果直接用大力学长的在G上dfs找最短路径的条数的话,会TLE,所以需要剪枝。剪枝方法是,在dfs中当遇到dis>d[u]就直接return。具体见代码:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <stack>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
const int N = + ; int n,m,st,ed;
int d[N],d2[N],val[N],pre[N];
struct edge
{
int v,w;
};
vector<edge> G[N]; void dij()
{
memset(pre,-,sizeof(pre));
memset(d,inf,sizeof(d));
memset(d2,,sizeof(d2));
d[]=;
d2[]=val[];
priority_queue<pii,vector<pii>,greater<pii> > Q;
Q.push(pii(,));
while(!Q.empty())
{
pii x = Q.top();Q.pop();
int u = x.second;
int dis = x.first;
if(d[u]<dis) continue;
for(int i=;i<G[u].size();i++)
{
edge& e = G[u][i];
if(d[e.v] >= d[u]+e.w)
{
if(d[e.v] > d[u]+e.w)
{
pre[e.v] = u;
d[e.v] = d[u]+e.w;
d2[e.v] = d2[u]+val[e.v];
Q.push(pii(d[e.v],e.v));
}
else
{
if(d2[e.v] < d2[u]+val[e.v])
{
pre[e.v] = u;
d2[e.v] = d2[u]+val[e.v];
Q.push(pii(d[e.v],e.v));
}
}
}
}
}
} int cnt = ;
bool vis[N];
void dfs(int u,int dis)
{
if(u==ed && dis==d[ed]) {cnt++;return;}
if(dis > d[ed]) return; // 剪枝!
for(int i=;i<G[u].size();i++)
{
edge& e = G[u][i];
if(!vis[e.v])
{
vis[e.v]=;
dfs(e.v,dis+e.w);
vis[e.v]=;
}
}
} void printAns(int now)
{
if(now != st) {printAns(pre[now]);printf(" ");}
printf("%d",now);
} int main()
{
while(scanf("%d%d%d%d",&n,&m,&st,&ed)==)
{
for(int i=;i<n;i++) {scanf("%d",val+i);G[i].clear();}
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u].push_back((edge){v,w});
G[v].push_back((edge){u,w});
}
dij(); cnt = ;memset(vis,,sizeof(vis));
dfs(st,); printf("%d %d\n",cnt,d2[ed]);
printAns(ed);
puts("");
}
}

  当然,用我自己之前的方法也是可以的:用set型的p数组记录来时的点,再反向dfs即可。具体见代码:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <stack>
using namespace std;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int,int> pii;
const int N = + ; int n,m,st,ed;
int d[N],d2[N],val[N],pre[N];
set<int> p[N];
struct edge
{
int v,w;
};
vector<edge> G[N]; void dij()
{
memset(pre,-,sizeof(pre));
memset(d,inf,sizeof(d));
memset(d2,,sizeof(d2));
d[]=;
d2[]=val[];
priority_queue<pii,vector<pii>,greater<pii> > Q;
Q.push(pii(,));
while(!Q.empty())
{
pii x = Q.top();Q.pop();
int u = x.second;
int dis = x.first;
if(d[u]<dis) continue;
for(int i=;i<G[u].size();i++)
{
edge& e = G[u][i];
if(d[e.v] >= d[u]+e.w)
{
if(d[e.v] > d[u]+e.w)
{
p[e.v].clear();
p[e.v].insert(u); pre[e.v] = u;
d[e.v] = d[u]+e.w;
d2[e.v] = d2[u]+val[e.v];
Q.push(pii(d[e.v],e.v));
}
else
{
p[e.v].insert(u); if(d2[e.v] < d2[u]+val[e.v])
{
pre[e.v] = u;
d2[e.v] = d2[u]+val[e.v];
Q.push(pii(d[e.v],e.v));
}
}
}
}
}
} int cnt = ;
void dfs(int u)
{
if(u == st) {cnt++;return;}
for(set<int>::iterator it=p[u].begin();it!=p[u].end();it++)
{
int v = *it;
dfs(v);
}
} void printAns(int now)
{
if(now != st) {printAns(pre[now]);printf(" ");}
printf("%d",now);
} int main()
{
while(scanf("%d%d%d%d",&n,&m,&st,&ed)==)
{
for(int i=;i<n;i++) {scanf("%d",val+i);G[i].clear();}
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u].push_back((edge){v,w});
G[v].push_back((edge){u,w});
}
dij(); cnt = ;
dfs(ed); printf("%d %d\n",cnt,d2[ed]);
printAns(ed);
puts("");
}
}

  

  想说明一点的是,我的方法跑的比大力学长的跑的快了2ms:他的46,我的44。。233= =。

PAT L2-001 紧急救援 —— (多参数最短路)的更多相关文章

  1. PTA L2-001 紧急救援 (带权最短路)

    <题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...

  2. PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集

    L2-001 紧急救援 (25 分)   作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...

  3. Task5.PyTorch实现L1,L2正则化以及Dropout

    1.了解知道Dropout原理 深度学习网路中,参数多,可能出现过拟合及费时问题.为了解决这一问题,通过实验,在2012年,Hinton在其论文<Improving neural network ...

  4. 修复FFMPEG 复用 PAT、PMT发送间隔小于25ms的错误

    目录 分析ffmpeg源码 分析问题 修改源码解决问题 分析ffmpeg源码 分析问题 mpegtsenc.c 找到发送PAT.PMT的函数 /* send SDT, PAT and PMT tabl ...

  5. 正则化,L1,L2

    机器学习中在为了减小loss时可能会带来模型容量增加,即参数增加的情况,这会导致模型在训练集上表现良好,在测试集上效果不好,也就是出现了过拟合现象.为了减小这种现象带来的影响,采用正则化.正则化,在减 ...

  6. 正则化项L1和L2

    本文从以下六个方面,详细阐述正则化L1和L2: 一. 正则化概述 二. 稀疏模型与特征选择 三. 正则化直观理解 四. 正则化参数选择 五. L1和L2正则化区别 六. 正则化问题讨论 一. 正则化概 ...

  7. 正则化项L1和L2的区别

    https://blog.csdn.net/jinping_shi/article/details/52433975 https://blog.csdn.net/zouxy09/article/det ...

  8. 机器学习(二十三)— L0、L1、L2正则化区别

    1.概念  L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数的平方的和的开方值. 2.问题  1)实现参数的稀疏有什么好处吗? 一个好处是可以简化 ...

  9. 机器学习中正则化项L1和L2的直观理解

    正则化(Regularization) 概念 L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数的平方的和的开方值. L0正则化 稀疏的参数可以防止 ...

随机推荐

  1. spring boot logback无感配置

    spring boot1.5.x版本的日志配置一直有一个问题,就是不能直接通过yml配置文件进行日志文件大小进行动态和方便的配置. 怎么解决?直接在springboot项目的maven工程中的src/ ...

  2. table html

    <html><head><title>demo-110101</title><style type="text/css"> ...

  3. OkHttp3 + retrofit2 封装

    0.下载文件 1.gradle 添加 compile 'com.squareup.retrofit2:retrofit:2.1.0'compile 'com.squareup.retrofit2:co ...

  4. luogu1313计算系数题解--二项式定理

    题目链接 https://www.luogu.org/problemnew/show/P1313 分析 二项式定理 \((a+b)^n=\sum_{k=0}^{n}{C^k_n a^k b^{n-k} ...

  5. multer使用

    使用multer 1.      在项目中下载multer操作模块 Npm install multer  --save 前端代码: <form class="layui-form&q ...

  6. 关于页面数据未保存改变路由(beforeunload,beforeRouteLeave)

    一下内容为笔者个人理解,如有出入还请大佬指出不胜感激 页面有数据未保存,用户离开页面分为两种 1 . 直接关闭浏览器标签 或者点击浏览器后退按钮 离开当前页面 2. 在页面内改变路由,或则刷新页面(不 ...

  7. LLVM新建全局变量

    在LLVM中,有原生的AST Clone,却没有一个比较好的Stmt copy功能,基于Scout在LLVM上进行的修改,我们实现了自己的Stmt Clone功能. 要进行Stmt Clone,肯定需 ...

  8. Spring Data JPA 大纲归纳

    第一天: springdatajpa day1:orm思想和hibernate以及jpa的概述和jpa的基本操作 day2:springdatajpa的运行原理以及基本操作 day3:多表操作,复杂查 ...

  9. mybatis-generator-gui

    mybatis-generator-gui介绍 mybatis-generator-gui是基于mybatis generator开发一款界面工具, 本工具可以使你非常容易及快速生成Mybatis的J ...

  10. web开发:css基础

    一.w3c架构分析 二.css三种引入 三.三种引入的优先级 四.基础选择器 五.长度单位与颜色 六.文件样式操作 七.display 一.w3c架构分析 <!DOCTYPE html> ...