最短路问题

带权最短路问题

陌路散爱 提交于 2020-04-04 15:08:33
最短路之最大点权问题 问题引入: PTA A1003 问题分析: 直接分析输入输出。 输入 点数n、边数m、起点st、终点ed 点权 边权 输出 最短路条数 最短路里最大点权和 题解 最短路算法无非dijkstra、Floyd、SPFA,这里以dijkstra算法为例。 在dijkstra的基础上再引入三个数组:weg[],点权,w[]记录最大点权,way[]记录最短路条数。 下面分析dij()函数: //邻接矩阵G[][],最短路数组dis[],访问数组vis[] void dij(int st, int ed)//传入起点、终点 { //初始化(从0开始计数) for (int i = 0; i < n; ++i) { vis[i] = 0; w[i] = 0; dis[i] = G[st][i]; } w[st] = weg[st];//起点的点权 way[st] = 1;//起点到起点的路径为1 dis[st] = 0; for (int i = 0; i < n; ++i) { int x = -1, mx = inf; for (int j = 0; j < n; ++j) { if (!vis[j] && dis[j] < mx) { x = j; m = dis[j]; } } if (x == -1) return;//若x为-1,则该点与其他点都不联通。 for

迷宫最短路问题

杀马特。学长 韩版系。学妹 提交于 2020-03-05 17:22:30
迷宫最短路问题 题意:从迷宫左上角到左下角,求最短路 输入:迷宫的横纵坐标和迷宫元素 输出:迷宫最短路所经过的坐标 代码如下: #include <iostream> #include <cstring> #include <cstdio> #include <queue> #include <string> using namespace std; int dx[] = {1,1,0,-1,-1,-1,0,1}; int dy[] = {0,-1,-1,-1,0,1,1,1}; int n, m; int ** maze; bool ** vis; struct node { int x, y; string record; node(int a, int b,string s):x(a),y(b) { record = s; } node() { x = y = 0; } }; queue<node> qu; string BFS() { node cur; string nex; int c,r; //记录路径 cur.x = 1,cur.y = 1; cur.record = "(1,1)\n"; qu.push(cur); vis[1][1] = 1; while(!qu.empty()) { cur = qu.front(); qu.pop(); /

【图论】【最短路】城市问题

ⅰ亾dé卋堺 提交于 2020-01-22 21:17:49
Description 设有n个城市,依次编号为0,1,2,……,n-1(n<=100),另外有一个文件保存n个城市之间的距离(每座城市之间的距离都小于等于1000)。当两城市之间的距离等于-1时,表示这两个城市没有直接连接。求指定城市k到每一个城市i(0<=I,k<=n-1)的最短距离。 Input 第一行有两个整数n和k,中间用空格隔开;以下是一个NxN的矩阵,表示城市间的距离,数据间用空格隔开。 Output 输出指定城市k到各城市间的距离(从第0座城市开始,中间用空格分开) Sample Input 3 1 0 3 1 3 0 2 1 2 0 Sample Output 3 0 2 解题思路 模板SPFA,但是要注意编号从0开始 #include < iostream > #include < cstdio > #include < cstring > using namespace std ; const int maxn = 0x7fffffff ; struct DT { int to , l , next ; } a [ 30000 ] ; int dis [ 10000 ] , head [ 10000 ] , pd [ 6000 ] , n , m , k , Gun = maxn , num ; int h , t , v [ 10000 ] , f [

【最短路问题】(单源,多源)

我与影子孤独终老i 提交于 2020-01-19 20:12:00
•单源最短路径 No.1 dijkstra算法 算法核心:(1)两个集合 s,t 分别保存已经更新过的和未更新的数据,用一个 vis[] 数组来实现; (2)用 dis[i] 数组保存当前 i 点到源点的最短路径长度,每次在dis中找到一个最小的值 dis[i] ,每次由 dis[i] 更新与 i 相连的dis值; p.s:dis[x]=0,x为源点; *(3)* 堆优化:每次找dis最小值时会花费大量时间,于是可以动用c++stl里的结构 大根堆(优先队列) 实现优化 时间复杂度:进行堆优化后的程序为 O(m*logn) 堆优化后code: q为大根堆。 1 void dijkstra(){ 2 memset(d,0x3f,sizeof(d)); 3 memset(v,0,sizeof(v)); 4 d[1]=0; 5 q.push(make_pair(0,1)); 6 while(q.size()){ 7 int x=q.top().second; 8 q,pop(); 9 if(v[x]) continue; 10 v[x]=1; 11 for(int i=head[x];i;i=next[i]){ 12 int y=ver[i],z=edge[i]; 13 if(d[y]>d[x]+z){ 14 d[y]=d[x]+z; 15 q.push(make_pair(-d[y]

图论----最短路问题

南楼画角 提交于 2019-12-04 03:46:33
最短路问题有3种常用方法: Floyd,Dijkstra,SPFA 以下为总结代码(参考) Floyd 可求图中任意两点间的最短路 时间复杂度上有很大不足----O(N^3) 代码难度简单 #include<bits/stdc++.h> typedef long long ll; using namespace std; ll n,m,k; ll s[1005][1005]; int main() { memset(s,0x3f,sizeof(s)); scanf("%lld%lld%lld",&n,&m,&k); for(ll i=1;i<=m;i++) { ll x,y,z; scanf("%lld%lld%lld",&x,&y,&z); s[x][y]=min(s[x][y],z); } for(ll i=1;i<=n;i++) { s[i][i]=0; for(ll j=1;j<=n;j++) { s[j][j]=0; for(ll o=1;o<=n;o++) { s[o][o]=0; s[j][o]=min(s[j][o],s[j][i]+s[i][o]); } } } for(ll i=1;i<=k;i++) { ll b,e; scanf("%lld%lld",&b,&e); if(s[b][e]<=0x3f3f3f3f/2) printf("%lld\n",s[b]

最短路详解

自闭症网瘾萝莉.ら 提交于 2019-11-27 05:04:18
最短路问题是图论中最基础的内容,在考试中也常常看到关于最短路的问题或模型。 最短路问题,即在一个图中,寻找两个节点之间的最短路径的问题。最短路问题分为单源最短路径问题(SSSP问题)和多源最短路径问题,在本文中会一一进行讲解。 在讲解最短路问题前,先补充几个知识点: 存图的方法:常见的存图方法有邻接表和邻接矩阵,设该图有$n$个节点,$m$条边,则邻接表的空间复杂度为$O(n+m)$ ,邻接矩阵的空间复杂度为$O(n^2)$ ,读者在题目中可以根据题目要求选择一种方法进行存图。关于具体操作可以参考各类信息学奥赛入门书籍,在本文中接下来亦会讲解。 优先队列(priority_queue):在C++STL中提供的一种数据结构,其内部实际是一个大根堆,功能与大根堆基本相同,需调用头文件<queue>。 二元组:C++提供一个二元组的定义与操作,其中: pair<类型a,类型b>:定义一个二元组类型,第一维和第二维的变量类型分别为$a,b$ make_pair(x,y) a:定义一个新的二元组a,类型为先前定义的二元组类型,第一维和第二维的值分别为$x,y$ a.first:取出二元组a的第一维的值 a.second:取出二元组a的第二维的值 单源最短路径(SSSP)问题 SSSP问题的基本模型为:给定一个起点s,找到s到图中其它所有节点的最短路径长度。在本文中, d[i] d [ i ]

最短路问题

家住魔仙堡 提交于 2019-11-27 03:40:24
最短路问题 有4种算法+广搜 分为单源最短路和多源最短路 floyd算法 多源最短路 O(n^3) Dijkstra 单源最短路 O ford算法 johnson算法 优化算法 SPFA算法 单源最短路 O(n^2)ford算法的队列优化算法 而最短路问题又有很多种,比如 最小环 哈密顿回路 最小生成树 弗洛伊德算法Floyd https://blog.csdn.net/Harington/article/details/81982299 定义g[i][j]表示i到j的最短路径,k是中介,i通过k到达j,指的是,只允许经过第k个结点 for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ if(g[i][k]==INF)continue;//优化时间复杂度 for(int j=1;j<=n;j++){ if(g[i][j]>g[i][k]+g[k][j]){ g[i][j]=g[i][k]+g[k][j]; } } } } 时间复杂度是O(n^3),对于大数据不合适,适合与n在100以内的数据 第一行输入结点数n和边数m 接下来的m行输入无向边情况 表示u与v相互连接,且距离为d,路费为p 最后输入a,b,求a到b的最短距离,当距离有多条时,输出路费最小的 利用Floyd算法实现多源最短路 本代码没有实现距离多条时,输出路费最小,且n<1000