单源最短路径

分支限界---单源最短路径

醉酒当歌 提交于 2019-12-17 17:43:08
#分支限界 -- - 单源最短路径 # include <iostream> # include <bits/stdc++.h> using namespace std ; # define inf 0x3f3f3f int c [ 100 ] [ 100 ] ; int dist [ 100 ] ; int prev [ 100 ] ; int n ; struct Vex { int i ; int length ; bool operator < ( const Vex & v ) const { return length > v . length ; } Vex ( ) { } ; Vex ( int v , int l ) { i = v ; length = l ; } } ; void shortest ( int v0 ) { priority_queue < Vex > Q ; Vex E ; E . i = v0 ; E . length = 0 ; Q . push ( E ) ; dist [ v0 ] = 0 ; while ( ! Q . empty ( ) ) { E = Q . top ( ) ; for ( int j = 1 ; j <= n ; j ++ ) { if ( ( c [ E . i ] [ j ] < inf ) && ( c

最短路径:单源最短路径与差分约束系统

核能气质少年 提交于 2019-12-15 17:51:59
学习自《算法导论》和Wiki 无权/权=1:BFS ——O(V+E) 有向图(非负边):Dijkstra——O(E+VlgV) 有向图(无环):Dijkstra——O(V+E) 一般(可正可负可环):Bellman-Ford———O(VE) 优化:SPFA 一丶BFS BFS ( G , s ) { //初始化 foreach ( v∈G . V ) { v . visit = 0 ; u . d = NIF ; u . path = nil } s . d = 0 ; s . path = nil ; s . visit = 1 ; //根节点进队 enqueue ( Q , s ) while ( Q not empty ) { u = dequeue ( Q ) foreach ( v∈Adj [ u ] ) if ( visit [ v ] == 0 ) { d . v = d . u + 1 ; v . path = u ; v . visit = 1 ; enqueue ( Q , v ) ; } } 复杂度分析 1.初始化成本O(V) 2.队列操作总时间为O(V) 3.每个结点进队和出队一次,只有出队时候才进行扫描,每个邻接链表最多扫描一次,所以用于扫描邻接表的总时间为O(E) 所以O(V+E) 松弛操作 每个结点v来说,我们维持一个属性v.d

图——单源最短路径

南笙酒味 提交于 2019-12-10 06:40:12
过程中的数组结果 1.数组d[维数=结点个数]:存放各个结点到源结点的距离,初始化为无穷大; 2.一维数组color[维数=结点个数]={WHITE,BLACK} :表示该结点是否被访问(非必须) 3.一维数组pred[维数=结点个数]:存放各个结点的父结点 4.优先队列Q Dijkstra(G, w, s) #输入 G:图 W:为图中边的权重,二维数组,用来存放边的权重 s:源结点 Input: A graph G, a matrix w representing the weights between vertices in G, source vertex s Output: None 步骤1:构建一维数组d[V]:存放到原点的距离,初始化为无穷大,color[V] for 𝑢 ∈ 𝑉 do 𝑑[𝑢] ← ∞, 𝑐𝑜𝑙𝑜𝑟[𝑢] ←WHITE; end 步骤2:将源结点到源结点的距离置为0,并将父结点置为NULL 𝑑[𝑠] ← 0; 𝑝𝑟𝑒𝑑[𝑠] ← NULL; 步骤3:将所有结点,以及结点的距离 放到优先队列Q中 𝑄 ← queue with all vertices; 步骤4:循环遍历直到队列Q为空 While 𝑁𝑜𝑛-𝐸𝑚𝑝𝑡𝑦(𝑄) do // Process all vertices 步骤4.1 返回队列Q中距离最小的结点u 𝑢 ←Extract-Min(𝑄);

P4779 【模板】单源最短路径(标准版)

折月煮酒 提交于 2019-12-04 00:22:40
如有乱码,请 点击 。 题目背景 2018 年 7 月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路。 然后呢? 100 \rightarrow 60 1 0 0 → 6 0; Ag \rightarrow Cu A g → C u; 最终,他因此没能与理想的大学达成契约。 小 F 衷心祝愿大家不再重蹈覆辙。 题目描述 给定一个 N N 个点, M M 条有向边的带非负权图,请你计算从 S S 出发,到每个点的距离。 数据保证你能从 S S 出发到任意点。 输入格式 第一行为三个正整数 N, M, S N , M , S。 第二行起 M M 行,每行三个非负整数 u_i, v_i, w_i u i ​ , v i ​ , w i ​ ,表示从 u_i u i ​ 到 v_i v i ​ 有一条权值为 w_i w i ​ 的边。 输出格式 输出一行 N N 个空格分隔的非负整数,表示 S S 到每个点的距离。 输入输出样例 输入 #1 复制 4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 输出 #1 复制 0 2 4 3 说明/提示 样例解释请参考 数据随机的模板题 。 1 \leq N \leq 100000 1 ≤ N ≤ 1 0 0 0 0 0; 1 \leq M \leq

P4779 【模板】单源最短路径(标准版)

南笙酒味 提交于 2019-12-02 12:25:32
P4779 【模板】单源最短路径(标准版) 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 1e5+5, inf = 0x3f3f3f3f; 5 struct Edge { 6 int from, to, dist; 7 }; 8 struct HeapNode { 9 int d, u; 10 bool operator < (const HeapNode& rhs) const { 11 return d > rhs.d; 12 } 13 }; 14 struct Dijkstra { 15 int n, m; 16 vector<Edge> edges; 17 vector<int> G[maxn]; 18 bool done[maxn]; 19 int d[maxn]; 20 int p[maxn]; 21 22 void init(int n) { 23 this->n = n; 24 for (int i = 1; i <= n; i++) G[i].clear(); 25 edges.clear(); 26 } 27 28 void AddEdge(int from, int to, int dist) { 29 edges

P3371 【模板】单源最短路径(弱化版)

早过忘川 提交于 2019-12-02 12:23:46
P3371 【模板】单源最短路径(弱化版) 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 10005; 4 struct edge { 5 int v, w; 6 }; 7 vector<edge> maps[maxn]; 8 int dis[maxn]; 9 bool vis[maxn]; 10 int n, m, s; 11 void add(int u, int v, int w) { 12 maps[u].push_back(edge{v,w}); 13 } 14 void spfa(int s) { 15 for (int i = 1; i <= n; i++) { 16 dis[i] = 2147483647; 17 vis[i] = false; 18 } 19 queue<int> que; 20 que.push(s), dis[s] = 0, vis[s] = true; 21 while(!que.empty()) { 22 int u = que.front(); 23 que.pop(); 24 vis[u] = false; 25 for(int i = 0; i < maps[u].size(); i++) { 26 int v = maps[u][i].v;