【模板】最短路
来源:互联网 发布:移动4g网络加速器 编辑:程序博客网 时间:2024/05/07 14:03
裸·最短路
权当模板存着
1.spfa 优化:无
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXN = 200005;int first[MAXN],next[MAXN],dis[MAXN];int tot = 0,n,m,ss,ee,f,t,v;bool use[MAXN];struct edge{ int f,t,v;}l[MAXN];void build(int f,int t,int v){ l[++ tot] = (edge){f,t,v}; next[tot] = first[f]; first[f] = tot; return;}queue < int > q;void spfa(int s){ memset(use,0,sizeof(use)); memset(dis,0x3f,sizeof(dis)); while(!q.empty()) q.pop(); dis[s] = 0,use[s] = true; q.push(s); while(!q.empty()) { int u = q.front(); use[u] = false; q.pop(); for(int i = first[u]; i != -1; i = next[i]) { int w = l[i].t; if(dis[w] > dis[u] + l[i].v) { dis[w] = dis[u] + l[i].v; if(use[w]) continue; q.push(w); use[w] = true; } } } return;}int main(){ memset(first,0xff,sizeof(first)); scanf("%d %d %d %d",&n,&m,&ss,&ee); for(int i = 1; i <= m; i ++) { scanf("%d %d %d",&f,&t,&v); build(f,t,v); build(t,f,v); } spfa(ss); printf("%d\n",dis[ee]); return 0;}
2.spfa_slf 优化:双端队列
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXN = 200005;int n,m,ss,e,f,t,v;int tot = 0;int first[MAXN],next[MAXN],dis[MAXN];bool use[MAXN];struct edge{ int f,t,v;}l[MAXN];void build(int f,int t,int v){ l[++ tot] = (edge){f,t,v}; next[tot] = first[f]; first[f] = tot; return;}deque < int > q;void spfa(int s){ memset(use,0,sizeof(use)); memset(dis,0x3f,sizeof(dis)); use[s] = true; dis[s] = 0; while(!q.empty()) q.pop_front(); q.push_back(s); while(!q.empty()) { int u = q.front(); use[u] = false; q.pop_front(); for(int i = first[u]; i != -1; i = next[i]) { int w = l[i].t; if(dis[w] > dis[u] + l[i].v) { dis[w] = dis[u] + l[i].v; if(use[w] == false) { use[w] = true; if(q.empty()) q.push_back(w); else if(dis[w] < dis[q.front()]) q.push_front(w); else q.push_back(w); } } } } return; }int main(){ memset(first,0xff,sizeof(first)); scanf("%d %d %d %d",&n,&m,&ss,&e); for(int i = 1; i <= m; i ++) { scanf("%d %d %d",&f,&t,&v); build(f,t,v); build(t,f,v); } spfa(ss); printf("%d\n",dis[e]); return 0;}
3.Dijkstra 优化:无
//久一点了的打法
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 400000 + 5;int first[MAXN],next[MAXN],dis[MAXN],tot;bool use[MAXN];int tk,c,ts,te;int f,t,v;struct edge{ int f,t,v;}l[MAXN];void build(int f,int t,int v){ l[++ tot] = (edge){f,t,v}; next[tot] = first[f]; first[f] = tot; return;}void dij(int s){ memset(use,0,sizeof(use)); memset(dis,0x3f,sizeof(dis)); dis[s] = 0;// memset(first,0xff,sizeof(first)); while(true) { int now = -1; int nowdist = 0x7fffffff; for(int i = 1; i <= tk; i ++) { if(nowdist > dis[i] && !use[i]) { now = i; nowdist = dis[i]; } } if(now == -1) return; use[now] = 1; for(int i = first[now]; i != -1; i = next[i]) { int w = l[i].t; if(dis[w] > dis[now] + l[i].v) dis[w] = dis[now] + l[i].v; } }}int main(){ memset(first,0xff,sizeof(first)); scanf("%d %d %d %d",&tk,&c,&ts,&te); for(int i = 1; i <= c; i ++) { scanf("%d %d %d",&f,&t,&v); build(f,t,v); build(t,f,v); } dij(ts); printf("%d\n",dis[te]); return 0;}
4.dij_heap 优化:堆
#include <iostream>#include <cstdio>#include <cmath>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int MAXN = 400000 + 5;int first[MAXN],next[MAXN],dis[MAXN],tot;bool use[MAXN];int tk,c,ts,te;int f,t,v;struct edge{ int f,t,v;}l[MAXN];struct dot{ int num,dis;};bool operator<(dot a,dot b){ return a.dis > b.dis;}void build(int f,int t,int v){ l[++ tot] = (edge){f,t,v}; next[tot] = first[f]; first[f] = tot; return;}priority_queue<dot>q;/*void dij_heap(int s){ memset(use,0,sizeof(use)); memset(dis,0x3f,sizeof(dis)); while(!q.empty()) q.pop(); dis[s] = 0; q.push((dot){s,dis[s]}); while(!q.empty()) { dot now = q.top(); use[now.num] = 1; q.pop(); for(int i = first[now.num] ; i != -1; i = next[i]) { int w = l[i].t; if(dis[w] > dis[now.num] + l[i].v) { dis[w] = dis[now.num] + l[i].v; if(!use[w]) q.push((dot){w,dis[w]}); } } }}*/void dij_heap(int s){ memset(use,0,sizeof(use)); memset(dis,0x3f,sizeof(dis)); while(!q.empty()) q.pop(); dis[s] = 0; q.push((dot){s,dis[s]}); while(!q.empty()) { int u = q.top().num; use[u] = 1; q.pop(); for(int i = first[u]; i != -1; i = next[i]) { int w = l[i].t; if(dis[w] > dis[u] + l[i].v) { dis[w] = dis[u] + l[i].v; if(!use[w]) q.push((dot){w,dis[w]}); } } }}int main(){ memset(first,0xff,sizeof(first)); scanf("%d %d %d %d",&tk,&c,&ts,&te); for(int i = 1; i <= c; i ++) { scanf("%d %d %d",&f,&t,&v); build(f,t,v); build(t,f,v); } dij_heap(ts); printf("%d\n",dis[te]); return 0;}
//下面这个 近一点
#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int MAXN = 200005;int first[MAXN],next[MAXN],dis[MAXN];bool use[MAXN];int n,m,ss,ee,tot = 0;struct edge{ int f,t,v;}l[MAXN];struct zt{ int u,v; bool operator < (const zt &b)const { return v > b.v; }};void build(int f,int t,int v){ l[++ tot] = (edge){f,t,v}; next[tot] = first[f]; first[f] = tot; return;}priority_queue < zt > q;void dij(int s,int e ){ memset(dis,0x3f,sizeof(dis)); memset(use,0,sizeof(use)); dis[s] = 0;// use[s] = true;//这是dij不是spfa!!! while(!q.empty()) q.pop(); q.push((zt){s,0}); while(!q.empty()) { zt x = q.top(); q.pop(); int u = x.u; if(use[u]) continue; use[u] = true; if(u == e) return; for(int i = first[u]; i != -1; i = next[i]) { int w = l[i].t; if(dis[w] > dis[u] + l[i].v) { dis[w] = dis[u] + l[i].v; q.push((zt){w,dis[w]}); } } } return;}int f,t,v;int main(){ memset(first,0xff,sizeof(first)); scanf("%d %d %d %d",&n,&m,&ss,&ee); for(int i = 1; i <= m ; i ++) { scanf("%d %d %d",&f,&t,&v); build(f,t,v); build(t,f,v); } dij(ss,ee); printf("%d\n",dis[ee]); return 0;}
0 0
- 最短路模板
- 最短路模板
- poj1125最短路模板
- 最短路 SPFA模板
- 最短路 kruskal模板
- 最短路 dijkstra模板
- 最短路模板
- 最短路模板总结
- 最短路模板
- Dijkstra 模板 最短路
- 最短路模板
- 【最短路算法模板】
- 最短路模板
- 最短路 模板
- 最短路模板
- 最短路 【spfa】 模板
- 最短路算法模板
- 最短路模板
- 集线器、路由器、交换机
- 前端BFC布局
- 《C++ Primer》读书笔记——第十六章_模板与泛型编程
- 数据库分表
- 安卓基础_5
- 【模板】最短路
- opencv采集图像并进行傅里叶变换
- How to convert Java Key Store file to pem/key for nginx
- 用bootstrap制作一个简单首页
- 51单片机 指纹模块 PCF8563模块实时时钟(2)
- HDOJ 1701 ACMer (对于浮点数计算的理解 水题)
- 安卓基础_6
- 变化,变化模型
- C++之内联函数