zoukankan      html  css  js  c++  java
  • Dij的堆优化


    #include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<queue> #define M 100000 #define pa pair<int,int>//优先比较第一个元素 using namespace std; int d[M],n,m,cnt,head[M],next[M],u[M],dis[M],num,s,t; bool f[M]; void add(int from,int to,int di) { num++; u[num]=to; next[num]=head[from]; head[from]=num; dis[num]=di; } int main() { scanf("%d%d%d%d",&n,&m,&s,&t); for(int i=1;i<=m;i++) { int uu,vv,d; scanf("%d%d%d",&uu,&vv,&d); add(uu,vv,d); add(vv,uu,d); } memset(d,127/3,sizeof(d)); d[s]=0; priority_queue<pa,vector<pa>,greater<pa> > q;//堆优化 q.push(make_pair(0,s));//make一个pa 距离s为0 标号为s while(!q.empty()) { int p=q.top().second;//取出优先级最高的点的 q.pop(); if(f[p])//判重 continue; f[p]=1; for(int i=head[p];i;i=next[i]) { if(d[u[i]]>d[p]+dis[i]) { d[u[i]]=d[p]+dis[i]; q.push(make_pair(d[u[i]],u[i]));//make一个新的 pa } } } cout<<d[t]; return 0; }
  • 相关阅读:
    ISBN号码
    计数问题
    小玉在游泳
    数字反转
    单调队列(学习笔记)
    LCA(学习笔记)
    emacs配置文件
    线段树(学习笔记)
    RMQ问题 ST算法(学习笔记)
    Lucas卢卡斯定理(学习笔记)
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5432822.html
Copyright © 2011-2022 走看看