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

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. 为WPF和Silverlight的Grid添加边框线

    http://www.cnblogs.com/chenxizhang/archive/2011/09/22/2185414.html

  2. CentOS学习笔记(二):检查系统版本号及32位或64位系统

    1.检查系统版本号 lsb_release -a 2.检查32位或64位系统 file /bin/ls

  3. Struts2(2)

    一.分模块开发:单独写模块的配置文件,把配置文件引入到核心配置文件中 Aaction的单独配置文件如下 <?xml version="1.0" encoding=" ...

  4. (转)msys2使用教程

    一.安装 官方下载地址 http://www.msys2.org/ 指定好安装路径(一般D根目录即可),一路下一步就好. 二.配置国内镜像.设置窗体修改颜色 使用[清华大学开源软件镜像站]中的地址,修 ...

  5. HihoCoder1415后缀数组三·重复旋律3

    重复旋律3 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多 ...

  6. WPF之X名称空间学习

    WPF的X名称空间都有什么呢?首先,盗用张图来说明: 我将就图表中的内容进行总结: 1.x:Array具有一个Iteams属性,它能暴漏一个ArratList实例,ArratList实例的内部成员类型 ...

  7. C#面向对象(一):明确几个简单的概念作为开胃菜

    绝对干货,总结了下C#面向对象的干货内容以及我几年来的使用心得,分享出来 先明确几个简单概念作为开胃菜: 1.命名空间 namespace BackStageManagement.Services 关 ...

  8. Unity3D for Android 纹理压缩支持

    http://blog.csdn.net/asd237241291/article/details/48548557 首先附图:Unity3D for Android支持的纹理压缩格式 纹理压缩可以通 ...

  9. RabbitMQ入门Demo

    之前环境安装已经介绍过了,下面直接跑个Demo. 1.添加Maven依赖 <dependency> <groupId>org.springframework.amqp</ ...

  10. jsp 的url传参中文乱码问题解决办法

    在js文件中,使用连接jsp的url传参,如果参数是中文会出现乱码问题,如下可以解决: 方法一:(已确认 可行) String username = new String(request.getPar ...