Dijkstra算法
来源:互联网 发布:java导出excel表格方法 编辑:程序博客网 时间:2024/06/04 19:54
Dijkstra朴素算法(邻接矩阵,贪心,O(n2)):
#include <bits/stdc++.h>using namespace std;const int maxn=1000+100;const int INF=100000000;int n,m;int g[maxn][maxn];bool visited[maxn];int d[maxn],pre[maxn];//迪杰斯特拉的朴素算法,O(n2)void dij(int start){ memset(visited,0,sizeof(visited)); for(int i=0;i<n;i++) d[i]=INF; d[start]=0; for(int i=0;i<n;i++){ int x,minn=INF; //寻找最小的d,浪费时间 for(int a=0;a<n;a++) if(!visited[a]&&d[a]<minn) minn=d[x=a]; visited[x]=true; for(int y=0;y<n;y++) if(d[x]+g[x][y]<d[y]){ d[y]=d[x]+g[x][y]; pre[y]=x; } }}int main(){ freopen("input.txt","r",stdin); ios::sync_with_stdio(false); cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<n;j++) g[i][j]=INF; for(int i=0;i<m;i++){ int a,b,c; cin>>a>>b>>c; g[a][b]=c; } dij(1);//从节点1到其他节点的最短路径 for(int i=0;i<n;i++) cout<<d[i]<<endl; cout<<"具体路径:"<<endl; int i=5; //cout<<i<<" "; for(;i!=0;i=pre[i]) printf("%d\n",i); return 0;}
Dijkstra优化算法(邻接表,优先队列,O[(n+m)logm],最差情况(密集图)为 O(n2logm) ):
#include <bits/stdc++.h>using namespace std;typedef pair<int,int> pii;const int maxn=1000+100;const int INF=100000000;struct node{ int from,to,dist; node(int from,int to,int dist):from(from),to(to),dist(dist){}};int n,m;vector<node> edges;vector<int> g[maxn];bool visited[maxn];int d[maxn],p[maxn];void AddEdge(int from,int to,int dist){ edges.push_back(node(from,to,dist)); g[from].push_back(edges.size()-1);}void dij(int start){ priority_queue<pii,vector<pii>,greater<pii> >q;//d和from for(int i=0;i<n;i++) d[i]=INF; d[start]=0; memset(visited,0,sizeof(visited)); q.push(make_pair(0,start)); while(!q.empty()){ pii x=q.top();q.pop(); int u=x.second; if(visited[u]) continue;//如果起点已经被访问过 visited[u]=true; for(int i=0;i<g[u].size();i++){ node &e=edges[g[u][i]]; if(d[u]+e.dist<d[e.to]){ d[e.to]=d[u]+e.dist; p[e.to]=e.from;//从from到to这条路径 q.push(make_pair(d[e.to],e.to)); } } }}int main(){ freopen("input.txt","r",stdin); ios::sync_with_stdio(false); cin>>n>>m; for(int i=0;i<m;i++){ int a,b,c; cin>>a>>b>>c; AddEdge(a,b,c); } dij(1);//从节点1到其他节点的最短路径 for(int i=0;i<n;i++) cout<<d[i]<<endl; cout<<"具体路径:"<<endl; int i=6; //cout<<i<<" "; for(;i!=0;i=p[i]) printf("%d\n",i); return 0;}
阅读全文
0 0
- Dijkstra算法
- dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra 算法
- dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- dijkstra算法
- CodeForces
- 如何在Linux下编译安装OpenCV
- 使用VS创建OpenCV工程
- 【JZOJ5296】【清华集训2017模拟】Sequence
- 两串旋转
- Dijkstra算法
- 使RibbonBar中的Button不可用(动态设置CMFCRibbonBar状态)
- ssh开发之登录实现
- Spring Security实践
- 行内元素和块级元素
- 最全oracle单行函数之其他函数用法详解
- 30分钟掌握ES6/ES2015核心内容(上)
- Linux操作系统下的串口通信
- 【离散化 && 线段树 && 染色】POJ