最短路 dijkstra算法 poj2387 bellman_ford spfa
来源:互联网 发布:mysql5.7数据库下载 编辑:程序博客网 时间:2024/05/22 00:09
最短路 dijkstra算法 poj2387 bellman_ford spfa
就是一个模板题,,,,,,,,,,,啊? 模板题 这个还要套模板? 一脸门鼻
直接上代码
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;#define inf (0x7f7f7f7f)const int maxn=100005;struct Edge{int from,to,dist;}eg;int T,n;vector<Edge>edges;//边 vector<int>g[maxn];//存储边在edges上的编号 bool done[maxn];int d[maxn];int p[maxn];struct node{ int d,u; bool operator < (const node &a) const { return d>a.d; } }temp,now;//利用优先队列 优化dijkstra算法 void init(int n)//初始化 {for(int i=1;i<=n;i++)g[i].clear();edges.clear(); }void AddEdge(int from,int to,int dist)//vector建立边比较快 {int m;eg.from=from;eg.to=to;eg.dist=dist;edges.push_back(eg);m=edges.size();g[from].push_back(m-1); }void dijkstra(int s){priority_queue<node>qu;for(int i=1;i<=n;i++) d[i]=inf;//初始化无穷大 注意加减的时候不要溢出 d[s]=0;temp.d=0,temp.u=s; memset(done,false,sizeof(done));qu.push(temp);//源点入队 while(!qu.empty()){now=qu.top();qu.pop();int u=now.u;if(done[u])continue;done[u]=true;for(int i=0;i<g[u].size();i++){Edge& e=edges[g[u][i]];if(d[e.to]>d[u]+e.dist)//如果新找到的点的距离小于原来找到的 {d[e.to]=d[u]+e.dist;p[e.to]=g[u][i];temp.d=d[e.to];temp.u=e.to;qu.push(temp);}}}}int main(){scanf("%d%d",&T,&n);for(int i=0;i<T;i++){int from,to,dist;scanf("%d%d%d",&from,&to,&dist);AddEdge(from,to,dist);//双向边AddEdge(to,from,dist);}dijkstra(n);printf("%d",d[1]); }
下面是bellman_ford 如果不是判别负值圈 比dijkstra要慢很多 但是内存占用少
#include<iostream>#include<cstdio>using namespace std;#define MAX 0x3f3f3f3f#define N 10100int u[N],v[N],w[N],T,n;int d[N];bool bellman_ford(){for(int i=1;i<=n;i++)d[i]=(i==n)?0:MAX;for(int i=1;i<=n-1;i++)for(int j=1;j<=2*T;j++)松弛{int x=u[j],y=v[j];if(d[x]<MAX) d[y]=min(d[y],d[x]+w[j]);}return true;}int main(){scanf("%d%d",&T,&n);for(int i=1;i<=T*2;i+=2){//要存两边要不然松弛是错的scanf("%d%d%d",&u[i],&v[i],&w[i]);u[i+1]=v[i];v[i+1]=u[i];w[i+1]=w[i];}bellman_ford();printf("%d",d[1]);}
下面是spfa 队列优化bellman_ford算法
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;#define inf (0x7f7f7f7f)const int maxn=100005;struct Edge{int from,to,dist;}eg;int T,n;vector<Edge>edges;//边 vector<int>g[maxn];//存储边在edges上的编号 bool inq[maxn];int d[maxn];int p[maxn],cnt[maxn];void init(int n)//初始化 {for(int i=1;i<=n;i++)g[i].clear();edges.clear(); }void AddEdge(int from,int to,int dist)//vector建立边比较快 {int m;eg.from=from;eg.to=to;eg.dist=dist;edges.push_back(eg);m=edges.size();g[from].push_back(m-1); }bool spfa(int s){queue<int>qu;memset(inq,0,sizeof(inq));memset(cnt,0,sizeof(cnt));for(int i=1;i<=n;i++) d[i]=inf;//初始化无穷大 注意加减的时候不要溢出 d[s]=0;inq[s]=true;qu.push(s);//源点入队 while(!qu.empty()){int u=qu.front();qu.pop();inq[u]=false;for(int i=0;i<g[u].size();i++){Edge& e=edges[g[u][i]];if(d[u]<inf && d[e.to]>d[u]+e.dist)//如果新找到的点的距离小于原来找到的 {d[e.to]=d[u]+e.dist;p[e.to]=g[u][i];if(!inq[e.to]){qu.push(e.to);inq[e.to]=true;if(++cnt[e.to]>n)return false;}}}}}int main(){scanf("%d%d",&T,&n);for(int i=0;i<T;i++){int from,to,dist;scanf("%d%d%d",&from,&to,&dist);AddEdge(from,to,dist);AddEdge(to,from,dist);}spfa(n);printf("%d",d[1]); }
从上到下 依次是 spfa-> bellman-> dijkstra
0 0
- 最短路 dijkstra算法 poj2387 bellman_ford spfa
- poj2387-最短路dijkstra算法
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- POJ2387 Til the Cows Come Home(最短路,Dijkstra算法,spfa算法,Floyd算法,深搜DFS)
- 【最短路】poj2387 SPFA
- 2544 最短路 Dijkstra算法 Floyd算法 Bellman_Ford算法 SPFA算法
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
- [ACM] 最短路算法整理(bellman_ford , SPFA , floyed , dijkstra 思想,步骤及模板)
- HDU 2544 最短路 Dijkstra 算法、 Floyd 算法 Bellman_ford算法
- poj2387--dijkstra算法求最短路--终于AC了。。。。
- poj 3259 最短路判负环 spfa算法和Bellman_ford算法
- 【最短路三算法】Floyd,Dijkstra,SPFA.
- 最短路算法 Dijkstra Bellman-Ford SPFA
- hdu2544 最短路 Bellman_Ford Dijkstra Folyd
- Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
- Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
- Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
- Dijkstra、Bellman_Ford、SPFA、Floyd算法复杂度比较
- MATLAB 中的fix(),floor(),ceil(),以及round()
- 游戏开发中嵌入直播因素
- android布局适配
- 网络基础技术:从HttpURLConnection到Volley框架
- javascript函数+闭包+立即执行函数
- 最短路 dijkstra算法 poj2387 bellman_ford spfa
- activity四种启动模式
- 算法-第四版-练习1.3.24解答
- leetcode242: Valid Anagram
- 用js定义类
- Mac mysql + sequel pro + netbeans
- 洛谷 P1099 树网的核
- android事件分发机制源码简析
- AsyncTask 无限播放