Dijkstra 单源最短路

来源:互联网 发布:python毕业设计项目 编辑:程序博客网 时间:2024/05/18 02:24
#include <iostream>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <string.h>#include <map>#include <set>#include <queue>#include <deque>#include <list>#include <bitset>#include <stack>#include <stdlib.h>#define lowbit(x) (x&-x)#define e exp(1.0)#define eps 1e-8//ios::sync_with_stdio(false);//    auto start = clock();//    cout << (clock()-start)/(double)CLOCKS_PER_SEC<<endl;typedef long long ll;typedef long long LL;using namespace std;typedef unsigned long long ull;//Dijkstra 单源最短路 刘哲/* * 使用优先队列优化Dijkstra算法 复杂度O(ElogE) 注意对vector<Edge>E[MAXN]进行初始化后加边 */const int INF=0x3f3f3f3f;const int MAXN=1000010;struct qnode{    int v;    int c;    qnode(int _v=0,int _c=0):v(_v),c(_c){}    bool operator <(const qnode &r)const    {        return c>r.c;    }};struct Edge{    int v,cost;    Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}};vector<Edge>E[MAXN];bool vis[MAXN];int dist[MAXN];void Dijkstra(int n,int start)//点的编号从1开始{    memset(vis,false,sizeof(vis));    for(int i=1;i<=n;i++)dist[i]=INF;    priority_queue<qnode>que;    while(!que.empty())que.pop();    dist[start]=0;    que.push(qnode(start,0));    qnode tmp;    while(!que.empty())    {        tmp=que.top(); que.pop();        int u=tmp.v;        if(vis[u])continue;        vis[u]=true;        for(int i=0;i<E[u].size();i++)        {            int v=E[tmp.v][i].v;            int cost=E[u][i].cost;            if(!vis[v]&&dist[v]>dist[u]+cost)            {                dist[v]=dist[u]+cost; que.push(qnode(v,dist[v]));            }                    }    }}void addedge(int u,int v,int w){    E[u].push_back(Edge(v,w));}int main()//刘哲{    int n,m;//n条边,m个点    cin>>n>>m;    for(int i=0;i<m;i++)    {        int a,b,c;        cin>>a>>b>>c;        addedge(a,b,c);    }    Dijkstra(n,1);    cout<<"1到各点的距离为:";    for(int i=2;i<=n;i++)cout<<dist[i]<<' ';    cout<<endl;}/*Input:5 71 2 101 4 301 5 1002 3 503 5 104 3 204 5 60Output:1到各点的距离为:10 50 30 60*/

原创粉丝点击