【模板】迪杰斯特拉

来源:互联网 发布:java项目发布到服务器 编辑:程序博客网 时间:2024/06/04 00:26

模拟过程

//基于1557

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int maxn=100000+10;int first[maxn<<1],nxt[maxn<<1],tot;int dis[maxn];int n,m,s,e;bool done[maxn];struct edge {    int f,t,v;}l[maxn<<1];void build(int f,int t,int v) {    l[++tot]=(edge){f,t,v};    nxt[tot]=first[f];    first[f]=tot;    return;}struct node{    int u,v;    /*bool operator < (const node & b)const     {        return v>b.v;    }*/};//分号必不可少 bool operator < (node a,node b){    return a.v > b.v;}//stl里大根堆用<处理,重载运算符时反过来处理就可以了priority_queue<node>q;//**< >里是node!**void init(){    tot=0;    memset(first,0xfff,sizeof(first));}void dij(int s,int e) {    memset(dis,0x3f3f3f3f,sizeof(dis));    memset(done,0,sizeof(done));    while(!q.empty()) q.pop();//可有可无的清空    q.push((node){s,0});//把node里的u和v都放到堆里,备用    dis[s] = 0;//    while(!q.empty())     {        node us=q.top();//将最短路的值最小的点作为中间点        q.pop();        int u=us.u;//中间点        if(done[u]) continue;//以u点为中间点的所有出点的最短路已经确定         done[u]=1;        for(int i=first[u];i!=-1;i=nxt[i])         {            int w=l[i].t;            if(dis[w]>dis[u]+l[i].v)             {                dis[w]=dis[u]+l[i].v;                q.push((node){w,dis[w]});//勿漏            }        }    }}int main(){    init();    int a,b,c;    scanf("%d%d%d%d",&n,&m,&s,&e);    for(int i=1;i<=m;i++)     {        scanf("%d%d%d",&a,&b,&c);        build(a,b,c);        build(b,a,c);    }    dij(s,e);    cout<<dis[e]<<endl;    return 0;}
原创粉丝点击