dijkstra和spfa
来源:互联网 发布:linux 日志切割脚本 编辑:程序博客网 时间:2024/06/03 22:42
dijstra是一个求单源最短路的一种方法,用优先队列求最短路虽然不如数组实现方便,但是比用邻接矩阵方法要快,理由很简单,满足入队,不满足便不会入队,这里代码基于刘汝佳的《算法竞赛入门经典第2版》上的代码补全,唯一的不同是一处的vector改成了数组,当然无所谓啦,只是因为在代码补全时没有看书自己看着补写。
</pre><pre name="code" class="cpp">
#include<cstdio>#include<iostream>#include<queue>#include<cstring>using namespace std;const int maxnode=100000; struct edge{int to;int dist;}edges[maxnode]; int bb;int p[maxnode];struct headnode{int d,u;bool operator <(const headnode& rhs)const{return d>rhs.d;//队列判断 }};vector<int>G[maxnode];int n;int d[maxnode];const int inf=1000000000;bool done[maxnode];void dijkstra(int s){priority_queue<headnode>Q;for(int i=1;i<=n;i++)d[i]=inf;//初始化 d[s]=0;memset(done,0,sizeof(done));Q.push((headnode){0,s});while(!Q.empty()){headnode x=Q.top();Q.pop();int u=x.u;if(done[u])continue;//避免重复入队,例如a更新b,入队,b在查找a时就会跳过 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];Q.push((headnode){d[e.to],e.to});}}}}//e=edges[g[u][i]]int main(){int num=0;int a,b,dis;//from,to,dis cin>>n;//dian cin>>bb;//bian for(int i=0;i<bb;i++){ cin>>a>>b>>dis;//a->b; edges[++num].to=b; G[a].push_back(num); edges[num].dist=dis;edges[++num].to=a;//b->a; G[b].push_back(num); edges[num].dist=dis; } cin>>a; dijkstra(a);for(int i=1;i<=n;i++){cout<<d[i]<<endl;}}//dijkstra是很基本的算法,最好也要搞懂他和spfa,bellmanford,的区别,建议先写熟floyd后掌握
--------------------------------------spfa-----------
<pre name="code" class="cpp">#include<queue>using namespace std;const int maxnode=100000;int cnt[maxnode];int inq[maxnode];int n;int d[maxnode];const int inf=1000000000;vector<int>G[maxnode];struct edge{int to,dist;}edges[10000];int p[10000];bool bellman(int s){queue<int>Q;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;Q.push(s);while(!Q.empty()){int u=Q.front();Q.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){p[e.to]=G[u][i];d[e.to]=d[u]+e.dist;if(!inq[e.to]){Q.push(e.to);inq[e.to]=true;//cout<<"la"<<endl;if(++cnt[e.to]>n)return false;}}}}return true;}int main(){int num=0;cin>>n;//dint b;cin>>b;int a,c,dis;for(int i=1;i<=b;i++){cin>>a>>c>>dis;edges[++num].to=a;edges[num].dist=dis;G[c].push_back(num);edges[++num].to=c;edges[num].dist=dis;G[a].push_back(num);}int x;cin>>x;bellman(x);for(int i=1;i<=n;i++)cout<<d[i]<<" ";}
依照题意修改代码
1 0
- dijkstra和spfa
- UVA - 10806 Dijkstra, Dijkstra. SPFA
- UVA 10806 Dijkstra, Dijkstra. spfa
- pku 1511 Invitation Cards (SPFA 和 dijkstra+优先级队列优化)
- poj 3268 Silver Cow Party Dijkstra 和SPFA
- hdu2112 HDU Today (最短路之dijkstra和spfa)
- hdu2066一个人的旅行(dijkstra和spfa算法)
- poj 3268 spfa 和dijkstra堆优化 +矩阵逆转。
- 最短路径问题的Dijkstra和SPFA算法总结
- 最短路径 -- Floyd-Warshall & Dijkstra & spfa 学习和思考
- bzoj2763飞行路线(dijkstra和SPFA两个版本)
- bzoj2662冻结(SPFA和dijkstra两个版本)
- C++——spfa和dijkstra算法模板
- 算法训练 最短路 dijkstra优先队列和spfa
- Dijkstra与spfa模板
- dijkstra+SPFA+Floyd
- spfa dijkstra队列优化
- Spfa vs dijkstra 模板
- ViewPager详解(一)简单介绍
- AngularJS: $broadcast $emit $on
- [LeetCode-Java]35. Search Insert Position
- 微信小程序:MINA视图层
- Oracle 自定义结构(Record)
- dijkstra和spfa
- 我在中东肝PS
- noip2013花匠
- Mac上用Python安装PIL
- HTML块级元素&行内元素概览
- ViewPager详解(二)广告轮播图
- 关闭虚拟机vmware自动挂起
- codeforces #375(div.2) 723E One-Way Reform 欧拉回路或网络流
- mesh collider使用的注意