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;}