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算法- 路径还原
// 路径还原 // 求最短路,并输出最短路径 // 在单源最短路问题中我们很容易想到,既然有许多条最短路径,那将之都存储下来即可 // 但再想一下,我们是否要把所有的最短路径都求出来呢? // 实际 ...
随机推荐
- 在 c#中 如何 重新激活一个控件
比如toolBar是一个组合控件 this.toolBar.CaptionHeight =this.toolBar.Items.Count * 60;//重新激活toolBar控件 CaptionHe ...
- 191 Number of 1 Bits 位1的个数
编写一个函数,输入是一个无符号整数,返回的是它所有 位1 的个数(也被称为汉明重量).例如,32位整数 '11' 的二进制表示为 00000000000000000000000000001011,所以 ...
- 解决ef第一次启动较慢
protected void Application_Start() { //禁用第一次ef查询对表__MigrationHistory的问题使用了ef的Code first会在第一次ef查询的时候会 ...
- hihocoder offer收割编程练习赛11 A hiho字符串
思路: 我用的尺取. 注意题目描述为恰好2个'h',1个'i',1个'o'. 实现: #include <iostream> #include <cstdio> #includ ...
- call方法的使用bug--参数undefined
call/apply是函数原型定义的方法(Function.prorotype),在使用时要注意第一个形参(args[0]),一定是指向函数所要挂载的上下文对象--context,若对象非必须,则要将 ...
- 原生开发之css样式问题(持续更新)
·移动端开发将div高度设置为设备高度 div{ Height:100vh; } · select选择器文字设置: /*select文字右对齐*/ select{ direction: rtl; } ...
- 关于react native在window下运行安卓的时候报 could not connect to development server
当出现这种问题是网上的解答方案都是一模一样的! 我这边先给个地址讲的是解决方案http://blog.csdn.net/qq_25827845/article/details/52974991 但是我 ...
- 建设一个能承受500万PV/每天的网站如果计算?
PV是什么: PV是page view的简写.PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv. 计算模型: 每台服务器每秒处理请求的数量=((80%*总PV量)/(24小时*60分*60 ...
- 最近面试oracle 数据库的知识点
1. Oracle跟SQL Server 2005的区别? 宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windo ...
- js面向对象之构造函数
最简单的面向对象程序<script type="text/javascript"> var obj = new Object(); obj.qq = '10791611 ...