作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出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算法打印路径)的更多相关文章

  1. L2-001. 紧急救援---(Dijkstra,记录路径)

    https://www.patest.cn/contests/gplt/L2-001 L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 ...

  2. 基于谷歌地图的Dijkstra算法水路路径规划

    最终效果图如下: 还是图.邻接表,可以模拟出几个对象=>节点.边.路径.三个类分别如下: Node 节点: using System; using System.Collections.Gene ...

  3. Floyd 算法 打印路径模板

    #include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> ...

  4. 基于dijkstra算法求地铁站最短路径以及打印出所有的路径

    拓展dijkstra算法,实现利用vector存储多条路径: #include <iostream> #include <vector> #include <stack& ...

  5. SPFA和FLOYD算法如何打印路径

    早晨碰到了一题挺裸的最短路问题需要打印路径:vijos1635 1.首先说说spfa的方法: 其实自己之前打的最多的spfa是在网格上的那种,也就是二维的 一维的需要邻接表+queue 以及对于que ...

  6. L2-001 紧急救援(dijkstra算法)

    题目: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上.当其他城市 ...

  7. Dijkstra算法(带路径模板)

    个人心得:Dijkstra算法是贪心思想的一种延伸,注意路径pre,pre数组表示此时最短路径中的前一个顶点.每次更新到目的点时更新: 从源点出发,更新路径,然后找出此时最短的点,然后以这个点为头,看 ...

  8. 【算法】Dijkstra算法(单源最短路径问题)(路径还原) 邻接矩阵和邻接表实现

    Dijkstra算法可使用的前提:不存在负圈. 负圈:负圈又称负环,就是说一个全部由负权的边组成的环,这样的话不存在最短路,因为每在环中转一圈路径总长就会边小. 算法描述: 1.找到最短距离已确定的顶 ...

  9. 最短路问题 Dijkstra算法- 路径还原

    // 路径还原 // 求最短路,并输出最短路径 // 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可 // 但再想一下,我们是否要把所有的最短路径都求出来呢? // 实际 ...

随机推荐

  1. mysql 中 时间函数 now() current_timestamp() 和 sysdate() 比较

    转载请注明出处 https://www.cnblogs.com/majianming/p/9647786.html 在mysql中有三个时间函数用来获取当前的时间,分别是now().current_t ...

  2. BOW-js浏览器对象模型

  3. subprocess模块和sys模块

    1.import sys # sys.path # sys.argv # 用来接收python解释器执行py文件后跟的参数#例如:python cp.py argv1 argv2 arg3#sys.a ...

  4. js插件定义事件中,this引用的实现模拟

    在web项目中,经常会使用jquery和mui等js框架,之前只是按照API说明去按规则使用,比如在jq和mui中,事件处理函数中可以直接用this访问事件源,如下面的代码: <!DOCTYPE ...

  5. .NET 使用 Highcharts生成扇形图 柱形图

    1.首先新建一个.NET网站,如图所示: 2.引用所需要的js类库,如下图 highcharts.js可以在网上搜索就可以找到下载了. 3.在Default.aspx页面引用js 4.在 body 下 ...

  6. CCF|分蛋糕|Java

    import java.util.Scanner; public class tyt { public static void main(String[] args) { Scanner in = n ...

  7. Android应用开发细节点

    1.如果handler是在主线程声明,就属于主线程,handleMessage属于引用handler的那个线程:2.ByteArrayOutputStream/ByteArrayInputStream ...

  8. 把Scheme翻译成Java和C++的工具

    一.为什么要写这个工具? 公司内容有多个项目需要同一个功能,而这些项目中,有的是用Java的,有的是用C++的,同时由于某些现实条件限制,无法所有项目都调用统一的服务接口(如:可能运行在无网络的情况下 ...

  9. Vuex/Vue 练手项目 在线汇率转换器

    详情请点击: https://zhuanlan.zhihu.com/p/33362758

  10. 使用VC++编写QQ群发器,MFC做UI

    由于公司业务需要,QQ群发器经常被用来发送QQ广告,购买的QQ群发器不好用不说,而且是按机器收费的,有些功能还不能修改. 所以公司派我来开发一款自己的QQ群发器,我给群发器取名叫做飞速群发器,用来给软 ...