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正则化 稀疏的参数可以防止 ...
随机推荐
- C++反汇编第三讲,反汇编中识别继承关系,父类,子类,成员对象
讲解目录: 1.各类在内存中的表现形式 备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提. 2.子类继承父类 2.1 子类中有虚函数,父类中有虚函数 : 都有的情况下 ...
- django+uwsgi+nginx: websock 报502/400
耽搁了近2个月,终于解决了,主要是nginx/uwsgi/django相关的配置: 一.django工程settings.py,添加 WEBSOCKET_FACTORY_CLASS = "d ...
- Angular7如何动态刷新Echarts图表
1 概述 echarts是百度的开源图表插件 Angular中引入echarts网上教程很多 Angular引入echarts,并使用动态刷新 2 安装 请参考大神的博客:https://blog.c ...
- svg使用
Vue.component('XSvg', () => import('./abc-svg')) <x-svg icon-name="personl ...
- HTML练习一
效果图 动态图 html代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- SpringBoot整合Mybatis问题
IDEA对xml文件处理的方式不同 在Eclipse中到dao文件与mapper.xml文件只要在同一级目录下即可 在IDEA中mapper.xml要放在resources目录下 注:resource ...
- 手把手封装axios
大佬链接: https://juejin.im/post/5b55c118f265da0f6f1aa354 一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库, ...
- 使用百度地图API自动获取地址和经纬度
先上效果图,这是直接点击获取经纬度和地址的.没有做搜索的功能. 代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...
- MVP架构的一个小例子
主角: MVP是一种编程的架构模式,M=Model,负责提供数据:V=View,负责显示数据:P=Presenter,负责处理数据. 应用例子: csharp写的一个qq机器人. 一.Model层 获 ...
- PHP扩展模块php_igbinary和php_redis的安装
php_igbinary : 在序列化和反序列化的效率上高于其自带的 php_redis :效率是相当高有链表排序功能 详情略 安装之前要准备 百度网盘: wampserver2.5-A ...