L2-001. 紧急救援

题目链接:https://www.patest.cn/contests/gplt/L2-001

Dijstra

本题是dijstra的拓展,在求最短路的同时,增加了不同的最短路径的条数和能够召集的最多的救援队数量。由于初学此算法,我先找了题练习(http://poj.org/problem?id=2387)。

代码如下:

 #include<cstdio>
#include<stack>
#define N 505
#define MAX 5000
using namespace std;
int n,m,s,d;
int pro[N];
int Map[N][N];
bool mark[N];
int sum[N];
int path[N];
int Distance[N];
int person[N];
int i,j;
stack<int>st;
int main(void){
freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(i=;i<n;++i)scanf("%d",&pro[i]);
for(i=;i<n;++i)
for(j=;j<n;++j)Map[i][j]=MAX;
while(m--){
int len;
scanf("%d%d%d",&i,&j,&len);
if(Map[i][j]>len)Map[i][j]=Map[j][i]=len;
}
for(i=;i<n;++i){
Distance[i]=MAX;
sum[i]=;
person[i]=pro[s];
if(Map[s][i]<MAX){
Distance[i]=Map[s][i];
path[i]=s;
person[i]+=pro[i];
}
}
mark[s]=,Distance[s]=;
while(){
int k,m=MAX;
for(i=;i<n;++i){
if(!mark[i]&&m>Distance[i]){
m=Distance[i];
k=i;
}
}
if(m==MAX)break;
mark[k]=;
for(i=;i<n;++i){
if(!mark[i]){
if(Distance[i]>Distance[k]+Map[k][i]){
Distance[i]=Distance[k]+Map[k][i];
person[i]=person[k]+pro[i];
path[i]=k;
sum[i]=sum[k];
}else if(Distance[i]==Distance[k]+Map[k][i]){
sum[i]+=sum[k];
if(person[i]<person[k]+pro[i]){
person[i]=person[k]+pro[i];
path[i]=k;
}
}
}
}
}
int temp=pro[d];
int k=d;
while(k!=s){
st.push(k);
k=path[k];
temp+=pro[k];
}
printf("%d %d\n",sum[d],temp);
printf("%d",s);
while(!st.empty()){
printf(" %d",st.top());
st.pop();
}
printf("\n");
return ;
}

上面普通dijkstra算法的复杂度是O(n^2)的,而可以用优先队列将其优化到O(nlgn),代码如下:

 #include <iostream>
#include <queue>
#include <vector>
#define N 505
using namespace std;
const int inf=0x3fffffff;
int n,m,s,d,p[N],pre[N],dis[N],per[N],num[N];
bool vis[N];
struct edge{int to,w;};
vector<edge>e[N];
struct node{
int u,d;
bool operator < (const node x)const{return d>x.d;}
};
priority_queue<node>q;
void dij(int s){
for(int i=;i<n;++i)dis[i]=inf;
dis[s]=;per[s]=p[s];num[s]=;pre[s]=-;
q.push((node){s,});
while(!q.empty()){
node t=q.top();q.pop();
int u=t.u;
if(vis[u])continue;
vis[u]=;
for(int i=;i<(int)e[u].size();++i){
int v=e[u][i].to,w=e[u][i].w; if(dis[u]+w==dis[v])num[v]+=num[u];
if(dis[u]+w<dis[v])num[v]=num[u]; if( (dis[u]+w==dis[v]&&per[u]+p[v]>per[v])
||dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
per[v]=per[u]+p[v];
pre[v]=u;
q.push((node){v,dis[v]});
}
}
}
}
void dfs(int k){
if(k==-)return;
dfs(pre[k]);
cout<<k<<" ";
}
int main(void){
std::ios::sync_with_stdio(false);
cin>>n>>m>>s>>d;
for(int i=;i<n;++i)cin>>p[i];
for(int i=;i<m;++i){
int u,v,w;
cin>>u>>v>>w;
e[u].push_back((edge){v,w});
e[v].push_back((edge){u,w});
}
dij(s);
cout<<num[d]<<" "<<per[d]<<"\n";
dfs(pre[d]);
cout<<d<<endl;
}

L2-001. 紧急救援的更多相关文章

  1. 天梯 L2 紧急救援 (dijkstra变形+记录路径)

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

  2. 【EMV L2】2CS.001.00 ~ 2CS.007.00

    测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...

  3. 大白话5分钟带你走进人工智能-第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归

    第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归 上一节中我们讲解了L1和L2正则的概念,知道了L1和L2都会使不重要的维度权重下降得多,重要的维度权重下降得少,引入 ...

  4. TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)

    这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...

  5. 机器学习之正则化【L1 & L2】

    前言 L1.L2在机器学习方向有两种含义:一是L1范数.L2范数的损失函数,二是L1.L2正则化 L1范数.L2范数损失函数 L1范数损失函数: L2范数损失函数: L1.L2分别对应损失函数中的绝对 ...

  6. 通俗易懂--岭回归(L2)、lasso回归(L1)、ElasticNet讲解(算法+案例)

    1.L2正则化(岭回归) 1.1问题 想要理解什么是正则化,首先我们先来了解上图的方程式.当训练的特征和数据很少时,往往会造成欠拟合的情况,对应的是左边的坐标:而我们想要达到的目的往往是中间的坐标,适 ...

  7. keras 添加L2正则 和 dropout层

    在某一层添加L2正则: from keras import regularizer model.add(layers.Dense(..., kernel_regularizer = regulariz ...

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

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

  9. 配置 L2 Population - 每天5分钟玩转 OpenStack(114)

    前面我们学习了L2 Population 的原理,今天讨论如何在 Neutron 中配置和启用此特性. 目前 L2 Population 支持 VXLAN with Linux bridge 和 VX ...

  10. L2 Population 原理 - 每天5分钟玩转 OpenStack(113)

    前面我们学习了 VXLAN,今天讨论跟 VXLAN 紧密相关的 L2 Population. L2 Population 是用来提高 VXLAN 网络 Scalability 的. 通常我们说某个系统 ...

随机推荐

  1. Angular2中的Service并不是单例模式

    2015年做了一个使用angularjs 1框架的项目,2016年伊始公司的项目转为使用Angular2框架. 在开发过程中发现了一个坑,这个坑就是在Angular JS 1.x中的Service是单 ...

  2. HTML5的文档结构

    HTML5的文档结构 HTML5简化了许多,它的设计遵循了3个原则:1.兼容性.2.实用性.3.通用访问性     1. header 元素     <header> 标签定义文档或者文档 ...

  3. redis服务器安装-SuSE Linux Enterprise Server 11 SP3

    一.下载 官网下载,可自选版本,点击进入下载,这里下载了redis-3.2.4 放到 /root/usr/local/redis/ 目录下 二.编译 1. 执行make编译redis tar -zxz ...

  4. smbaclient

    在linux中通过smbaclient获取windows的共享文件 列出windows的共享目录 $ smbclient -L .xxx -U administrator%password 进入指定共 ...

  5. 跨线程传递栈变量带来异常指针Crash

    在手Q动漫的一份古老的代码中,现网发现少数crash,错误代码示例: char str[100] = "hello"; dispatch_async(dispatch_get_ma ...

  6. js onblur 和 onkeyup 事件用法

    1. onblur 表示失去焦点时触发 2. onkeyup 表示键盘每输完一个字符之后触发,就是键盘上的按键被放开时. 例子如下: <!DOCTYPE HTML PUBLIC "-/ ...

  7. WinForm笔记一:文本框只允许输入数字

    在WinForm的文本框中,有时候只允许数字,而不能输入除数字以外的其他字符,要调用TextBox的KeyPress事件,代码如下: //只允许输入数字 if (e.KeyChar<'0'||e ...

  8. Python学习笔记——进阶篇【第九周】———协程

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  9. [Q]pdfFactory虚拟打印机的安装

    安装打图精灵过程中会提示是否安装pdfFactory虚拟打印机,建议选择安装. 若未安装,在安装打图精灵之后想安装pdfFactory,该软件可以在打图精灵应用程序文件夹下找到( 系统"开始 ...

  10. html的简单表单制作...day5 php

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...