L2-001. 紧急救援 (Dijkstra算法打印路径)
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。
输出格式:
第一行输出不同的最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出首尾不能有多余空格。
输入样例:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
输出样例:
2 60
0 1 3
#include<stdio.h>
#include<math.h>
#include<stdlib.h> #define MAX 502
#define INFI 9999999 int G[MAX][MAX],nv,ne,c1,c2; //图,结点数,边数,起点,终点
int know[MAX]; //访问标记
int distance[MAX]; //距离
int num[MAX]; //最短路径条数
int weight[MAX]; //每个点的权值
int w[MAX]; //最短路径上的点权值总和
int pre[MAX]; //存放每个结点前一个结点
void printPath( int v);
void CreateGraph();
void Dijkstra( );
int main()
{
int i;
scanf("%d%d%d%d",&nv,&ne,&c1,&c2);
for( i=; i<nv; i++)
scanf("%d",&weight[i]);
CreateGraph();
Dijkstra();
printf("%d %d\n",num[c2],w[c2]);
printPath(c2);
return ;
} void CreateGraph()
{
int i,j;
int v1,v2;
int dn;
for( i=; i<nv; i++)
for( j=; j<nv; j++)
G[i][j]=INFI;
for( i=; i<ne; i++)
{
scanf("%d%d%d",&v1,&v2,&dn);
G[v1][v2]=G[v2][v1]=dn; //无向图
}
}
void Dijkstra( )
{
int i,j,k;
int min;
for( i=; i<nv; i++)
{
know[i]=;
distance[i]=G[c1][i]; //更新起点到所有顶点的距离
}
distance[c1]=; //起点到起点的距离为0
w[c1]=weight[c1];
num[c1]=;
for( i=; i<nv; i++)
{
k=-;
min = INFI;
for( j=; j<nv; j++)
{
if( !know[j] && distance[j]<min)
{
k=j;
min = distance[j];
}
}
if( k==-) break;
know[k]=; //寻找到最短的距离,标记该点
for( j=; j<nv; j++)
{
if( !know[j] && min+G[k][j]<distance[j]) //更新距离
{
distance[j] = min+G[k][j];
num[j] = num[k];
w[j] = w[k] + weight[j];
pre[j]=k;
}
else if( !know[j] && min+G[k][j]==distance[j])
{
num[j]=num[j]+num[k];
if( w[k]+weight[j]>w[j])
{
w[j]=w[k]+weight[j];
pre[j]=k;
}
}
}
}
} void printPath( int v) //递归打印路径
{
if( v==c1){
printf("%d",v);
return;
}
printPath( pre[v]);
printf(" %d",v);
}
L2-001. 紧急救援 (Dijkstra算法打印路径)的更多相关文章
- L2-001. 紧急救援---(Dijkstra,记录路径)
https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...
- 基于谷歌地图的Dijkstra算法水路路径规划
最终效果图如下: 还是图.邻接表,可以模拟出几个对象=>节点.边.路径.三个类分别如下: Node 节点: using System; using System.Collections.Gene ...
- Floyd 算法 打印路径模板
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> ...
- 基于dijkstra算法求地铁站最短路径以及打印出所有的路径
拓展dijkstra算法,实现利用vector存储多条路径: #include <iostream> #include <vector> #include <stack& ...
- SPFA和FLOYD算法如何打印路径
早晨碰到了一题挺裸的最短路问题需要打印路径:vijos1635 1.首先说说spfa的方法: 其实自己之前打的最多的spfa是在网格上的那种,也就是二维的 一维的需要邻接表+queue 以及对于que ...
- L2-001 紧急救援(dijkstra算法)
题目: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市 ...
- Dijkstra算法(带路径模板)
个人心得:Dijkstra算法是贪心思想的一种延伸,注意路径pre,pre数组表示此时最短路径中的前一个顶点.每次更新到目的点时更新: 从源点出发,更新路径,然后找出此时最短的点,然后以这个点为头,看 ...
- 【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现
Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...
- 最短路问题 Dijkstra算法- 路径还原
// 路径还原 // 求最短路,并输出最短路径 // 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可 // 但再想一下,我们是否要把所有的最短路径都求出来呢? // 实际 ...
随机推荐
- Jmeter+Jenkins+Ant自动化集成环境搭建
搭建环境: JDK:jdk1.8.0_92 Ant:apache-ant-1.9.7 Jmeter: apache-jmeter-3.0 Jenkins:jenkins-2.19.3 具体环境配置 1 ...
- .net 发送邮件验证码
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Ma ...
- echart动态加载数据
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>EChar ...
- 块级元素的text-align对行内元素和果冻元素(inline-block)的作用
块级元素社设置了text-align:center以后,对其直接行内元素/果冻元素.继承行内元素/果冻元素都会产生“居中效应”. <style> .test4{ text-align: c ...
- iOS Programming Localization 本地化
iOS Programming Localization 本地化 Internationalization is making sure your native cultural informatio ...
- was--创建概要文件(典型)
1.第一步 2 .创建 3.创建 4 .典型 5 下一步 6 下一步 7.下一步 8.输入用户和密码,下一步 9.下一步 10.下一步 11.下一步 12.下一步 13.下一步 14.创建 ...
- rabiitmq
Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...
- Redis 存储字符串和对象
今天用redis存储,发现客户端jedis提供的存储方法中存储的类型只有String和byte数据,没有能够存储对象的,网上发现可以序列化存储对象.这就开始了我第一次序列化之旅. 1 测试类 ...
- jboss中JVM监控
1)打开 http://server-name-or-ip/jmx-console/HtmlAdaptor2)在 jboss.system 节点找到 type=ServerInfo ,点击进入3)找到 ...
- vue热重载
依据官网使用 webpack 的 Hot Module Replacement API,Vuex 支持在开发过程中热重载 mutation.module.action 和 getter.你也可以在 B ...