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

  这题因为点数比较多,所以如果直接用大力学长的在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. 使用Harbor搭建Docker私有仓库

    ip:192.168.0.145 环境设置 防火墙,selinux等,可以使用本章开头的那个shell脚本 其他主机的hosts文件也都添加上 ip hub.aaa.com windows系统的hos ...

  2. winfrom_权限设置_TreeView的相关问题

    1.获取TreeView的值: 循环TreeView,获取checked每个节点的Text,串起来用逗号“,”隔开,保存到数据库. List<string> list = new List ...

  3. 【温故知新】php 魔术方法

    <?php class Magic{ private $name; /** *构造方法,在类被实例化时自动调用,一般用于初始化操作 */ public function __construct( ...

  4. js 中, set 与 数组 相互转换

    主要用 Array.from 方法 1.array --> set (数组转set) let array = [1, 2, 3, 4]; let set = new Set(array); 2. ...

  5. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  6. pxc5.7 报错:WSREP_SST: [ERROR] xtrabackup_checkpoints missing

    PXC 5.7 WSREP_SST: [ERROR] xtrabackup_checkpoints missing PXC5.7,在启动其中的一个节点,碰到了 [ERROR] xtrabackup_c ...

  7. Maven 安装依赖包

    Guide to installing 3rd party JARs Although rarely, but sometimes you will have 3rd party JARs that ...

  8. ping不通github

    Linux 下 host文件在 /etc/hosts Windows下 host文件在C:\Windows\System32\drivers\etc 在host文件的最后面加上: Linux sudo ...

  9. Python3+Appium学习笔记04-自动下载apk

    在项目中,app更新后,都会发布新的apk版本,然后去蒲公英对应的网站上扫码下载对应的apk进行测试.所以就在想,通过app参数进行安装时,是否可以先通过代码去拉取一遍最新的apk安装包. ​ 因为学 ...

  10. Java查漏补缺

    1.自动转换按从低到高的顺序转换.不同类型数据间的优先关系如下: 低 ---------------------------------------------> 高 byte,short,ch ...