eoj1818 dijkstra求最短路及其条数

news/2024/11/16 7:00:35/

求出有n(1 < n <= 100)个结点有向图中,结点1到结点n的最短路径,以及最短路径的条数。

Input

第一行有2个整数n和m( 0 < m < 3000),接下来m行每行有三个整数u,v,w结点u到v之间有一条权为w的边(w<100000)。

Output

输出只有一行,为结点1到结点n之间的最短路径及其条数(用空格隔开),如果1到n之间不存在路径,输出 -1 0。

Sample Input

3 3

1 2 10

2 3 15

1 3 25

Sample Output

25 2

 

 

 

分析:本题中两相邻点间可能存在多条路,但每条路长度相同,这点在题中并没有说明。

思路:做两次dijkstra即可,第一次用于求出各点到源点的最短距离。第二次用于统计最短路条数。分两类统计:一类为最短路间没有中间定点的,另一类为最短路间有中间顶点的。

 

 

 

 

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <algorithm>using namespace std;
int cost[101][101],path[101][101],low[101],dis[101],num[101]={};//low和dis数组分别是两次dijkstra的当前i点到源点的最短路
bool vis[101];                                                  //path保存两点间路径条数
const int MAXN=10000001;                                        //num保存点到源点最短路径数目int main()
{int n,m,i,j,k;memset(vis,false,sizeof(vis));scanf("%d%d",&n,&m);for(i=0;i<101;++i){         //初始化代价矩阵for(j=0;j<101;++j){cost[i][j]=MAXN;}}for(i=0;i<m;++i){           //读数据int a,b,c;scanf("%d%d%d",&a,&b,&c);cost[a][b]=c;path[a][b]++;}vis[1]=true;                //第一次dijkstra求最短路for(i=2;i<=n;++i)low[i]=cost[1][i];for(i=2;i<=n;++i){int minn=MAXN+1;for(j=1;j<n;++j){if(!vis[j] && low[j]<minn){minn=low[j];k=j;}}vis[k]=true;for(j=1;j<=n;++j){if(!vis[j]){low[j]=min(low[j],low[k]+cost[k][j]);}}}memset(vis,false,sizeof(vis));vis[1]=true;                    //第二次dijkstra求最短路条数,最短路分两类,一类直达,一类借助中间点达for(i=2;i<=n;++i) dis[i]=cost[1][i];for(i=2;i<=n;++i)               //第一类直达if(dis[i]==low[i])num[i]=path[1][i];for(i=2;i<=n;++i){int minn=MAXN+1;for(j=1;j<=n;++j){if(!vis[j] && dis[j]<minn){minn=dis[j];k=j;}}vis[k]=true;for(j=1;j<=n;++j){if(!vis[j]){dis[j]=min(dis[j],dis[k]+cost[k][j]);}if(dis[k]+cost[k][j]==low[j])   //统计第二类,通过中间点到达的路径数目num[j]+=num[k]*path[k][j];}}if(low[n]>=MAXN)printf("-1 0\n");elseprintf("%d %d\n",low[n],num[n]);return 0;
}



http://www.ppmy.cn/news/244204.html

相关文章

自考总结:202304考期

考虑成绩昨天刚出&#xff0c;打算做下2023年4月考期的总结。 报考 202304考期报了三科&#xff1a;数据结构导论、管理经济学、信息系统开发与管理。这三科之中&#xff0c;除了信息系统开发与管理已经考过 2 次了&#xff0c;数据结构导论上次学了弃考了&#xff08;考前复…

bzoj 1818/1732 聚会

首先&#xff0c;答案的点一定在三组lca中的一个上 它在那个最深的lca上&#xff0c;不要问我为什么 或者&#xff0c;这三组lca一定有两个重复的&#xff0c;答案是那个不重复的。 #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>…

Yolov5 (v6.1)添加注意力机制

Apply Transformer in the backbone 1、要把注意力结构代码放到common.py文件中 2、手把手带你Yolov5 (v6.1)添加注意力机制(一)&#xff08;并附上30多种顶会Attention原理图&#xff09; 3、手把手带你Yolov5 (v6.1)添加注意力机制(二)&#xff08;在C3模块中加入注意力机…

最新万能门店小程序V5.1.0 独立版源码

使用说明&#xff08;更详细配置见程序根目录下的pdf文档&#xff09;&#xff1a; 1&#xff0c;宝塔新建网站&#xff0c;网站运行目录要指向/public 2&#xff0c;开启SSL&#xff0c;配置好伪静态 3&#xff0c;把网址www.niumawu.com批量替换为你自己的网址 4&#xff0c…

NOI 1818:红与黑(C++)

题目地址&#xff1a;http://noi.openjudge.cn/ch0205/1818/ 题目&#xff1a;求地图中能到达的黑砖总数 一开始没有思路&#xff0c;参考了&#xff1a;http://blog.csdn.net/c20190102/article/details/52329390 思路&#xff1a;简单搜索 使用二维数组保存地图&#xff…

ural 1818 Fair Fishermen

题意&#xff1a; 有n个人分鱼&#xff0c;第一个人先来拿&#xff0c;检查一下总数&#xff0c;如果不能恰好分成n份&#xff0c;则扔掉多余的部分&#xff0c;然后拿走自己应得的1/n&#xff0c;第二个人也重复这个步骤&#xff0c;直到第n个人&#xff0c;然后告诉你每次扔掉…

【BZOJ1818】内部白点

链接&#xff1a;BZOJ1818 解法&#xff1a;树状数组 题意转化为求线段的交点个数。 先将任一坐标离散化&#xff0c;这里以 x x 为例。之后将 x" role="presentation" style="position: relative;">xx 与 y y 坐标分别排序,求出这些线段。以…

NOI / 2.5基本算法之搜索-1818:红与黑

总时间限制: 1000ms 内存限制: 65536kB 描述 有一间长方形的房子&#xff0c;地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上&#xff0c;只能向相邻的黑色瓷砖移动。请写一个程序&#xff0c;计算你总共能够到达多少块黑色的瓷砖。 输…