图论最短路模板

迪杰斯特拉算法

单源最短路,不能有负权的边

时间复杂度:O(ElogE)    //V为顶点数,E为边数

输入dis[]    //dis[t]代表从s到t的最短路径

 

使用Vector:

const int INF=0x3f3f3f3f;
vector<pair<int,int> > v[maxn];
int dis[maxn];

void dijkstra(int s)
{
    memset(dis,INF,sizeof(dis));
    dis[s]=0;
    priority_queue<pair<int,int>,vector<pair<int,int> >,great<pair<int,int> > > que;
    que.push(make_pair(dis[s],s));
    while(!que.empty()){
        int now=que.top().second;
        que.pop();
        for( i=0;i<v[now].size();i++ ){
            int t=v[now][i].first;
            if( dis[t]>dis[now]+v[now][i].second ){
                dis[t]=dis[now]+v[now][i].second;
                que.push(make_pair(dis[t],t));
            }
        }
    }
}

手写邻接表:

const int INF=0x3f3f3f3f;
int dis[maxn],u[maxn],v[maxn],w[maxn],head[maxn],cnt;
priority_queue< pair<long long,int>,vector< pair<long long,int> >,greater< pair<long long,int> > > que;
struct edge{
    int v,w,next;
}edge[maxn];

void add_edge(int u,int v,int w)
{
    edge[cnt].v=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}

void init()
{
    cnt=0;
    memset(head,-1,sizeof(head));
    while(!que.empty())
        que.pop();
}

void dijkstra(int s)
{
    dis[s]=0;
    memset(dis,INF,sizeof(dis));
    que.push(make_pair(dis[s],s));
    while(!que.empty()){
        pair<int,int> now=que.top();
        que.pop();
        if( dis[now.second]<now.first )
            continue;
        for( int i=head[now.second];i!=-1;i=edge[i].next ){
            int t=edge[i].v;
            if( dis[t]>dis[now.second]+edge[i].w )
            {
                dis[t]=dis[now.second]+edge[i].w;
                que.push( make_pair( dis[t],t ) );
            }
        }
    }
}

 

posted @ 2019-07-10 17:08  远风行百里  阅读(155)  评论(0编辑  收藏  举报