dijkstra 链式前向星 pill版 模板


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int mod = (int) 1e9+7;

int n,m,dist[200005],head[200005],vis[200005],now;
struct edge{
    int to,next,val;
}e[20000005];
void init(int x,int y,int v){
    e[++now].to=y,e[now].val=v,e[now].next=head[x],head[x]=now;
    e[++now].to=x,e[now].val=v,e[now].next=head[y],head[y]=now;
}

struct node{
    int id,val;
    node(int id,int val):id(id),val(val){} //构造方法
    bool operator < (const node &x)const{ //重写运算符,val越小优先级越高
        return val > x.val;
    }
};
priority_queue<node> q; //优先队列默认从大到小
void dij(int x){
    dist[x]=0;
    q.push(node(x,0));
    while(!q.empty()){
        int u=q.top().id; //得到优先队列里val最小的node结构体的id值
        q.pop();
        vis[u]=1; //如果当前结点已经被作为最近点去更新其他点的话,下次再访问到就直接跳过
        for(int i=head[u];~i;i=e[i].next){ //i一开始是u的头结点,往后跳,当i==-1循环结束
            int v=e[i].to; //v是取出下一个结点的编号
            if(vis[v])continue;
            if(dist[v]-e[i].val>dist[u]){ //如果距离被更新
                dist[v]=dist[u]+e[i].val;
                q.push(node(v,dist[v])); //把更新的结点放入优先队列
            }
        }
    }
}


int main()
{
    scanf("%d%d",&n,&m);
        memset(dist,125,sizeof(dist));
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));
        now=0;
        int x,y,z;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&x,&y,&z);
            init(x,y,z);
        }
        dij(1);
        if(dist[n]>mod)printf("qwb baka\n");
        else printf("%d\n",dist[n]);

    return 0;
}
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#include<vector>
#define N 200009
#define ll long long
#define pill pair<int,int>
#define pb push_back
#define mk make_pair
using namespace std;

ll read(){ ll ans=0; char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;}


vector<pill> v[N];


priority_queue<pill,vector<pill>,greater<pill> >Q;
int vis[N];
int dist[N];

int main(){
    memset(dist,125,sizeof(dist));
    int n=read(),m=read();
    for(int i=1;i<=m;i++){
        int a=read(),b=read(),c=read();
        v[a].pb(mk(b,c));v[b].pb(mk(a,c));
    }
    Q.push(mk(0,1));dist[1]=0;
    while(!Q.empty()){
        int j=Q.top().second;Q.pop();
        if(vis[j])continue;vis[j]=1;
        for(int i=0;i<v[j].size();i++){
            if(vis[v[j][i].first])continue;
            if(dist[v[j][i].first]>dist[j]+v[j][i].second){
                dist[v[j][i].first]=dist[j]+v[j][i].second;
                Q.push(mk(dist[v[j][i].first],v[j][i].first));
            }
        }
    }
    printf("%d\n",dist[n]);
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/81130192