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
原创粉丝点击