PAT L2-001 紧急救援 —— (多参数最短路)
和天梯中的直捣黄龙差不多。但是,通过这个问题,我对多参数最短路又有了更深一层的了解。
这题因为点数比较多,所以如果直接用大力学长的在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 紧急救援 —— (多参数最短路)的更多相关文章
- PTA L2-001 紧急救援 (带权最短路)
<题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- Task5.PyTorch实现L1,L2正则化以及Dropout
1.了解知道Dropout原理 深度学习网路中,参数多,可能出现过拟合及费时问题.为了解决这一问题,通过实验,在2012年,Hinton在其论文<Improving neural network ...
- 修复FFMPEG 复用 PAT、PMT发送间隔小于25ms的错误
目录 分析ffmpeg源码 分析问题 修改源码解决问题 分析ffmpeg源码 分析问题 mpegtsenc.c 找到发送PAT.PMT的函数 /* send SDT, PAT and PMT tabl ...
- 正则化,L1,L2
机器学习中在为了减小loss时可能会带来模型容量增加,即参数增加的情况,这会导致模型在训练集上表现良好,在测试集上效果不好,也就是出现了过拟合现象.为了减小这种现象带来的影响,采用正则化.正则化,在减 ...
- 正则化项L1和L2
本文从以下六个方面,详细阐述正则化L1和L2: 一. 正则化概述 二. 稀疏模型与特征选择 三. 正则化直观理解 四. 正则化参数选择 五. L1和L2正则化区别 六. 正则化问题讨论 一. 正则化概 ...
- 正则化项L1和L2的区别
https://blog.csdn.net/jinping_shi/article/details/52433975 https://blog.csdn.net/zouxy09/article/det ...
- 机器学习(二十三)— L0、L1、L2正则化区别
1.概念 L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数的平方的和的开方值. 2.问题 1)实现参数的稀疏有什么好处吗? 一个好处是可以简化 ...
- 机器学习中正则化项L1和L2的直观理解
正则化(Regularization) 概念 L0正则化的值是模型参数中非零参数的个数. L1正则化表示各个参数绝对值之和. L2正则化标识各个参数的平方的和的开方值. L0正则化 稀疏的参数可以防止 ...
随机推荐
- 旋转动画(RotateTransform)
Silverlight的基础动画包括偏移.旋转.缩放.倾斜和翻转动画,这些基础动画毫无疑问是在Silverlight中使用得最多的动画效果,其使用也是非常简单的.相信看过上一篇<偏移动画(Tra ...
- Python 序列操作符与函数(字符串)
Python序列包括:元组.列表.字符串. 1.1 序列共同支持的函数: 函数 功能 说明 cmp(seq1,seq2) 比较序列大小 从左到右依次比较,直到比较出大小 len(seq1) 获取序列长 ...
- 抽奖JQ
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- MYSQL WHERE语句
过滤条件(WHERE) 如果你失忆了,希望你能想起曾经为了追求梦想的你. QQ群:651080565(php/web 学习课堂) 例子:淘宝首页上,我们会看到很多个商品,但这些商品,并不是 ...
- jEasyUI 菜单与按钮
jQuery EasyUI 菜单与按钮 – 创建简单的菜单 <div id="mm" class="easyui-menu" style="wi ...
- 在线播放mp4
在线播放mp4 1.准备好支持再网页上播放的mp4格式 AVC(h264) 格式的mp4 2.用ckplayer控制播放 (1)到ckplayer下载js.如:http://www.ckplayer. ...
- Oralce问题之ORA-12560:TNS协议适配器错误
在Windows系统中,通过CMD命令打开命令窗口,通过命令:sqlplus / as sysdba回车后提示 协议适配器错误 可能原因: (1).Oralce数据库监听服务没启动起来 通过开始-&g ...
- Java&Selenium&TestNG&ZTestReport 自动化测试并生成HTML自动化测试报告
一.摘要 本篇博文将介绍如何借助ZTestReport和HTML模版,生成HTML测试报告的ZTestReport 源码Clone地址为 https://github.com/zhangfei1984 ...
- Python GUI--Tkinter简单实现个性签名设计
一.Tkinter的介绍和简单教程Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序.由于 Tkinter 是内置到 pytho ...
- 按照教程自动安装RFNoC时.在使用pip安装pybombs时出现报错,解决办法
$ sudo apt-get install git $ sudo apt-get install python-setuptools python-dev python-pip build-esse ...