[patl2-001]紧急救援
解题关键:最短路的变形。
1、按顶点存储,$O(n^2)$
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define max_v 502
using namespace std;
typedef long long ll;
int pre[max_v],pathnum[max_v],toval[max_v],val[max_v];
int cost[max_v][max_v],d[max_v],used[max_v],V;
void dijkstra(int s){ //边权和点权都是通过顶点体现
fill(d,d+V,inf);
fill(used,used+V,);
fill(pre,pre+V,-); d[s]=;
pathnum[s]=;
toval[s]=val[s]; while(true){
int v=-;
for(int u=;u<V;u++){
if(!used[u]&&(v==-||d[u]<d[v])) v=u;
} if(v==-) break;
used[v]=true; for(int u=;u<V;u++){
if(used[u]==false&&cost[u][v]!=inf){//????
if(d[u]>d[v]+cost[v][u]){
d[u]=d[v]+cost[v][u];
pre[u]=v;
pathnum[u]=pathnum[v];
toval[u]=toval[v]+val[u];
}else if(d[u]==d[v]+cost[v][u]){
pathnum[u]+=pathnum[v];
if(toval[u]<toval[v]+val[u]){
pre[u]=v;
toval[u]=toval[v]+val[u];
}
}
}
}
}
}
vector<int> get_path(int t){
vector<int>path;
for(;t!=-;t=pre[t]) path.push_back(t);
reverse(path.begin(), path.end());
return path;
} int N,M,S,D;
int main(){
cin>>N>>M>>S>>D;
V=N;
for(int i=;i<N;i++) cin>>val[i];
for(int i=;i<V;i++){
for(int j=;j<V;j++){
if(i!=j) cost[i][j]=cost[i][j]=inf;
}
}
for(int i=;i<M;i++){
int a,b,c;
cin>>a>>b>>c;
cost[a][b]=cost[b][a]=c;
}
dijkstra(S);
printf("%d %d\n",pathnum[D],toval[D]);
vector<int>path=get_path(D);
for(int i=;i<path.size();i++){
printf("%d%c",path[i],i==path.size()-?'\n':' ');
}
return ;
}
2、按边存储 $O(nlogn)$
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<vector>
#include<queue>
#define max_v 502
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct edge{
int to,cost;
};
typedef pair<int,int>P;//按边存储,默认不可以自己到自己进行dp
int V,pre[max_v],pathnum[max_v],val[max_v],toval[max_v];
vector<edge>G[max_v];
int d[max_v];
void dijkstra(int s){
priority_queue<P,vector<P>,greater<P> >que;
fill(d,d+V,inf);
fill(pre,pre+V,-);
toval[s]=val[s];
pathnum[s]=;
d[s]=;
que.push(P(,s));
while(!que.empty()){
P p=que.top();que.pop();
int v=p.second;
if(d[v]<p.first) continue;
for(int i=;i<G[v].size();i++){
edge e=G[v][i];
if(d[e.to]>d[v]+e.cost){
d[e.to]=d[v]+e.cost;
pathnum[e.to]=pathnum[v];
toval[e.to]=toval[v]+val[e.to];
pre[e.to]=v;
que.push(P(d[e.to],e.to));
}else if(d[e.to]==d[v]+e.cost){
pathnum[e.to]+=pathnum[v];
if(toval[e.to]<toval[v]+val[e.to]){
toval[e.to]=toval[v]+val[e.to];
pre[e.to]=v;
}
}
}
}
} vector<int> get_path(int t){
vector<int>path;
for(;t!=-;t=pre[t]) path.push_back(t);
reverse(path.begin(), path.end());
return path;
} int N,M,S,D;
int main(){
cin>>N>>M>>S>>D;
V=N;
for(int i=;i<N;i++) cin>>val[i];
for(int i=;i<M;i++){
int a,b,c;
cin>>a>>b>>c;
G[a].push_back((edge){b,c});
G[b].push_back((edge){a,c});
}
dijkstra(S);
printf("%d %d\n",pathnum[D],toval[D]);
vector<int>path=get_path(D);
for(int i=;i<path.size();i++){
printf("%d%c",path[i],i==path.size()-?'\n':' ');
}
return ;
}
3、代码三
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<vector>
#define inf 0x3f3f3f3f
#define max_v 502
using namespace std;
typedef long long ll;
int pre[max_v],pathnum[max_v],toval[max_v],val[max_v];
int cost[max_v][max_v],d[max_v],used[max_v],V;
void dijkstra(int s){ //边权和点权都是通过顶点体现
fill(d,d+V,inf);
fill(used,used+V,);
fill(pre,pre+V,-); d[s]=;
pathnum[s]=;
toval[s]=val[s]; while(true){
int v=-;
for(int u=;u<V;u++){
if(!used[u]&&(v==-||d[u]<d[v])) v=u;
} if(v==-) break;
used[v]=true; for(int u=;u<V;u++){
if(d[u]>d[v]+cost[v][u]){
d[u]=d[v]+cost[v][u];
pre[u]=v;
pathnum[u]=pathnum[v];
toval[u]=toval[v]+val[u];
}else if(d[u]==d[v]+cost[v][u]){
pathnum[u]+=pathnum[v];
if(toval[u]<toval[v]+val[u]){
pre[u]=v;
toval[u]=toval[v]+val[u];
}
}
}
}
}
vector<int> get_path(int t){
vector<int>path;
for(;t!=-;t=pre[t]) path.push_back(t);
reverse(path.begin(), path.end());
return path;
} int N,M,S,D;
int main(){
cin>>N>>M>>S>>D;
V=N;
for(int i=;i<N;i++) cin>>val[i];
for(int i=;i<V;i++){
for(int j=;j<V;j++){
cost[i][j]=cost[i][j]=inf;
}
}
for(int i=;i<M;i++){
int a,b,c;
cin>>a>>b>>c;
cost[a][b]=cost[b][a]=c;
}
dijkstra(S);
printf("%d %d\n",pathnum[D],toval[D]);
vector<int>path=get_path(D);
for(int i=;i<path.size();i++){
printf("%d%c",path[i],i==path.size()-?'\n':' ');
}
return ;
}
[patl2-001]紧急救援的更多相关文章
- swift 001
swift 001 = 赋值是没有返回值的 所以 int a=10; int b=20; if(a=b){ printf("这个是错误的"); } swift 中的模运算 是支 ...
- [SDK2.2]Windows Azure Virtual Network (4) 创建Web Server 001并添加至Virtual Network
<Windows Azure Platform 系列文章目录> 在上一章内容中,笔者已经介绍了以下两个内容: 1.创建Virtual Network,并且设置了IP range 2.创建A ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数001·3D函数
<zw版·Halcon-delphi系列原创教程> Halcon分类函数001·3D函数 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“proce ...
- Android 开发错误信息001
Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessExceptio ...
- python解无忧公主的数学时间编程题001.py
python解无忧公主的数学时间编程题001.py """ python解无忧公主的数学时间编程题001.py http://mp.weixin.qq.com/s?__b ...
- php大力力 [005节] php大力力简单计算器001
2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ...
- php大力力 [001节]2015-08-21.php在百度文库的几个基础教程新手上路日记 大力力php 大力同学 2015-08-21 15:28
php大力力 [001节]2015-08-21.php在百度文库的几个基础教程新手上路日记 大力力php 大力同学 2015-08-21 15:28 话说,嗯嗯,就是我自己说,做事认真要用表格,学习技 ...
- Web前端学习笔记(001)
....编号 ........类别 ............条目 ................明细....................时间 一.Web前端学习笔记 ...
- 001 The Hello World In Csharp
C#是面向对象编程语言,语法和JAVA非常相似.接下来让我们看一下C#的Hello world. //001.cs using System; public class Hello { public ...
- nexus-2.13.0-01.war
https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.13.0-01.war
随机推荐
- asp.net 锚点
可以使用锚点,但这里可使用灵活处理 首先获取需要滚动到的位置的id,如,可以设置一个元素(,注:要在form里),另外在form的任意位置设置 代码如下: 注:a标签里不要有内容,在回传的地方调用 代 ...
- Dom节点操作常用方法
1.访问/获取节点 document.getElementById(id); //返回对拥有指定id的第一个对象进行访问 document.getElementsByName(name); //返回带 ...
- XML DOM学习
XML 文档对象模型定义访问和操作XML文档的标准方法. XML DOM 是 XML Document Object Model 的缩写,即 XML 文档对象模型. DOM 将 XML 文档作为一个树 ...
- uva11078 - Open Credit System(动态维护关键值)
这道题使用暴力解法O(n*n)会超时,那么用动态维护最大值可以优化到O(n).这种思想非常实用. #include<iostream> #include<cstdio> #in ...
- CODEVS 1174 靶形数独
题目描述 Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地 迷上了数独游戏,好胜的他们想用数独来一比高低.但普通 的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z ...
- LCD升压反压驱动电路
在嵌入式系统里,较多场合需要LCD人机界面.分析以下LCD驱动电路. LCD_VIN是3.6~5V,经过DC/DC burst升压得到LCD_AVDD,LCD_AVDD为LCD需要的模拟电压,根据LC ...
- element table固定表头,表的高度自适应解决方法
主要是通过在mounted生命周期中,改变tableHeight的值,来让表格的高度自适应. 标签: <el-table ref="table" :data="ta ...
- ASP.NET 整理比较全的URL重写解决方案
经常有人请我指导应该如何动态地“重写”URL,以在他们的ASP.NETweb应用中发布比较干净的URL端点.这个博客帖子概述了几个方法,你可以用来在ASP.NET中干净地映射或重写URL,以及按照你自 ...
- hdu 4336 Card Collector —— Min-Max 容斥
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4336 bzoj 4036 的简单版,Min-Max 容斥即可. 代码如下: #include<cst ...
- apache配置详解 apache安装路径
http://www.linuxidc.com/Linux/2015-02/113921.htm 不同apache的安装方式 的安装目录示例 http://www.121down.com/articl ...