解题关键:最短路的变形。

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]紧急救援的更多相关文章

  1. swift 001

    swift 001  = 赋值是没有返回值的 所以 int a=10; int b=20; if(a=b){ printf("这个是错误的"); } swift  中的模运算 是支 ...

  2. [SDK2.2]Windows Azure Virtual Network (4) 创建Web Server 001并添加至Virtual Network

    <Windows Azure Platform 系列文章目录> 在上一章内容中,笔者已经介绍了以下两个内容: 1.创建Virtual Network,并且设置了IP range 2.创建A ...

  3. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数001·3D函数

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数001·3D函数 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“proce ...

  4. Android 开发错误信息001

    Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessExceptio ...

  5. python解无忧公主的数学时间编程题001.py

    python解无忧公主的数学时间编程题001.py """ python解无忧公主的数学时间编程题001.py http://mp.weixin.qq.com/s?__b ...

  6. php大力力 [005节] php大力力简单计算器001

    2015-08-22 php大力力005. php大力力简单计算器001: 上网看视频,看了半天,敲击代码,如下: <html> <head> <title>简单计 ...

  7. php大力力 [001节]2015-08-21.php在百度文库的几个基础教程新手上路日记 大力力php 大力同学 2015-08-21 15:28

    php大力力 [001节]2015-08-21.php在百度文库的几个基础教程新手上路日记 大力力php 大力同学 2015-08-21 15:28 话说,嗯嗯,就是我自己说,做事认真要用表格,学习技 ...

  8. Web前端学习笔记(001)

    ....编号    ........类别    ............条目  ................明细....................时间 一.Web前端学习笔记         ...

  9. 001 The Hello World In Csharp

    C#是面向对象编程语言,语法和JAVA非常相似.接下来让我们看一下C#的Hello world. //001.cs using System; public class Hello { public ...

  10. nexus-2.13.0-01.war

    https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.13.0-01.war

随机推荐

  1. Memcached之缓存雪崩,缓存穿透,缓存预热,缓存算法

    缓存雪崩 缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 解决思路: 1,采用加锁计数,或者使用合理的队列 ...

  2. 卸载 Oracle 的 JDK

    mac $ java -version java version "1.8.0_66" Java(TM) SE Runtime Environment (build 1.8.0_6 ...

  3. Spring3.2.9 + JdbcTemplate 事务

    XML新增声明式事务配置 <!-- 事务管理器 --> <bean id="transactionManager" class="org.springf ...

  4. (转) Android Service完全解析,关于服务你所需知道的一切(上)

    相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序 ...

  5. python--匿名函数lambda

    Python语言使用lambda关键字来创建匿名函数. 所谓匿名,即不再使用def语句这样标准的形式定义一个函数. lambda只是一个表达式,而不是一个代码块,函数体比def简单很多. 仅仅能在la ...

  6. LeetCode OJ:Combination Sum III(组合之和III)

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  7. jdbc connection为什么放在webINF的lib里面

    jdbc connection为什么放在webINF的lib里面

  8. C++string类整理

    string类 string类 头文件:#include<string> 名称空间:using namespace std; 初始化: string Str; String类的构造函数和析 ...

  9. xdebug的安装测试

    1.下载 php -version PHP 7.2.0 (cli) (built: Dec 7 2017 23:07:46) ( NTS DEBUG ) 如果PHP版本是7.2以上的必须要下载Xdeb ...

  10. tar 多文件解压压缩

    tar 多文件解压:因为tar -zxvf一次值能解压一个文件,所以用xargs -n1 .先查找 ls *gz | xargs -n1 tar -zxvf .要解压的文件在list中 cat lis ...