单源无负权最短路径-Dijkstra算法 19-11-09

vector和pair的使用是使得这整个算法界面整洁的关键

memset的置最大(int的最大): memset(a,0x3f,sizeof(a));

优先队列里的push时的采用-d[v]是为了取路径最小的最先进行运算,减少运算量(改成d[v]会超时)

改变初始扔入队列的初始值(例子中是d[1])会改变求的初始点

vector插入时r,s都要添加一次(若只添加一次则是有向)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
const int N=100010;
vector<pair<int,int> >e[N];
int d[N];
int main()
{
    int n,m,k;
    int r,s,l;
    cin>>n>>m>>k;
    memset(d,0x3f,sizeof(d));
    while(m--)
    {
        cin>>r>>s>>l;
        e[r].push_back(make_pair(s,l));
        e[s].push_back(make_pair(r,l));
    }
    priority_queue<pair<int,int> >q;
    d[1]=0;
    q.push(make_pair(-d[1],1));
    while(!q.empty())
    {
        int now=q.top().second;
        q.pop();
        for(int i=0;i<e[now].size();i++)
        {
            int v=e[now][i].first;
            if(d[now]+e[now][i].second<d[v])
            {
                d[v]=d[now]+e[now][i].second;
                q.push(make_pair(-d[v],v));
            }
        }
    }
    while(k--)
    {
        cin>>r>>s;
        cout<<d[r]+d[s]<<endl;
    }
    return 0;
}```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,771评论 0 7
  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 4,781评论 0 3
  • 1、用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回。 2、用C语言实现函数void ...
    希崽家的小哲阅读 6,354评论 0 12
  • 公司:丛迪服装有限公司 【日精进打卡第419天】 【知~学习】 《六项精进》大纲0遍,共331遍; 《六项精进》通...
    阿诗玛_6209阅读 289评论 0 0
  • 车站是来与往的交汇;车站是聚与散的集合;车站是爱与恨交织的地方。 曾记得小时候,爸爸去外地上班,是妈妈送爸爸去车的...
    xuan璇阅读 241评论 0 0