[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
随机推荐
- c、rust、golang、swift性能比较
mac 计算速度视觉判断是(由好到差):c > rust > swift > golang 内存开销在mac上是(由好到差):c > rust > golang > ...
- GEF入门实例_总结_05_显示一个空白编辑器
一.前言 本文承接上一节:GEF入门实例_总结_04_Eclipse插件启动流程分析 在第三节( GEF入门实例_总结_03_显示菜单和工具栏 ),我们创建了菜单和工具栏. 这一节,我们来实现:点击 ...
- LeetCode OJ:Binary Tree Level Order Traversal II(二叉树的层序遍历)
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...
- poj1321
这个题要是乍一看很难会想深搜,确实如此,可如果知道了深搜的方法,这个题就简 了不少,至于用深搜的时候要考虑当k==n和k<n时这咱种情况,当K==n时,当然很好想 到深搜搜下很容易找到所有方法, ...
- UVA - 11019 Matrix Matcher (二维字符串哈希)
给你一个n*m的矩阵,和一个x*y的模式矩阵,求模式矩阵在原矩阵中的出现次数. 看上去是kmp在二维情况下的版本,但单纯的kmp已经无法做到了,所以考虑字符串哈希. 类比一维情况下的哈希算法,利用容斥 ...
- h5 离线缓存小demo
传统的web应用是在线应用,这其实也是web的特色,对于PC时代问题并不大,但到了移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得更低.比如:在火车上,穿山越岭进隧道,便无法访问w ...
- JavaScript创建对象的几种重要模式
一.工厂模式 1. 代码示例 function person(name, age) { var p = new object(); p.name = name; p.age = age; p.sayN ...
- 寻找php.ini之旅
/usr/local/php-fpm/lib/php.ini 可以通过phpinfo()来查看 https://www.cnblogs.com/ChineseMoonGod/p/6474772.htm ...
- Day2-Python基础2---列表、元组操作
一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 names = ["maqing"," peilin" ...
- ZOJ 4016 Mergeable Stack(栈的数组实现)
Mergeable Stack Time Limit: 2 Seconds Memory Limit: 65536 KB Given initially empty stacks, the ...