题目

SPFA模板题,题目中数据可能有两个点之间有多条边直接相连,使用 unordered_map< int, unordered_map< int, int>>, 来存储图的结构,可以方便的去除重边。

实现

#include<stdio.h>
#include<cmath>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<deque>
#include<string>
#include<unordered_map>
#include<unordered_set>
using namespace std; #define max(a, b) (a) > (b)? (a) : (b)
#define min(a, b) (a) < (b)? (a) : (b)
unordered_map<int, unordered_map<int, int>> gMap;
int gMinDist[100005];
bool gInQueue[100005];
int Spfa(int s, int t) {
queue<int> Q;
Q.push(s);
memset(gMinDist, -1, sizeof(gMinDist));
memset(gInQueue, false, sizeof(gInQueue));
gMinDist[s] = 0;
gInQueue[s] = true;
//题目中不存在负权边,因此不需要检查有负权回路。检查存在负权回路,则需要通过
//判断否个点是否被更新超过 N 次,N为点的总数
while (!Q.empty()) {
int u = Q.front();
Q.pop();
gInQueue[u] = false;
for (auto x : gMap[u]) {
int v = x.first;
if (gMinDist[v] == -1 || gMinDist[v] > gMinDist[u] + x.second) {
gMinDist[v] = gMinDist[u] + x.second;
if (!gInQueue[v]) { //如果不存在队列中,则加入队列。剪枝优化
Q.push(v);
}
}
}
}
return gMinDist[t];
}
int main() {
int n, m, s, t;
int u, v, d;
scanf("%d %d %d %d", &n, &m, &s, &t);
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &d); //用 unordered_map 存储图的结构,可以方便的去除重边
if (gMap.find(u) == gMap.end() || (gMap[u].find(v) == gMap[u].end() || gMap[u][v] > d)) {
gMap[u][v] = d;
gMap[v][u] = d;
}
}
int min_dist = Spfa(s, t);
printf("%d\n", min_dist);
return 0;
}

hiho1093_spfa的更多相关文章

随机推荐

  1. google prettify 代码高亮显示

    引入js和css文件 下载地址 http://files.cnblogs.com/jaday/prettify.zip js文件代码 !function(){var q=null;window.PR_ ...

  2. [theWord] 一种英文字典的基类设计

    theWord --- 一种英文字典的基类设计 使用场景 想写一个应用,来记录自己背单词时候,对每个单词的记忆状况之类的东西.至于为什么做这个,试过了一些背单词软件,并不觉得好用,自己做一个吧. 那么 ...

  3. POI 简单合并单元格

    public class MergedCells { /** 测试使用的POI版本是3.1 * @param args */ public static void main(String[] args ...

  4. 2016年11月18日 星期五 --出埃及记 Exodus 20:9

    2016年11月18日 星期五 --出埃及记 Exodus 20:9 Six days you shall labor and do all your work,六日要劳碌作你一切的工,

  5. HTML DOM简介

    HTML DOM简介 1.当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model),HTML DOM模型被创建为对象的树.如下所示: 2.通过可编程的对象模型,Ja ...

  6. JavaScript(1)

    JavaScript(1) 第一次见到JavaScript的时候,看到了熟悉的"Java",原来都是骗人的,李鬼不是李逵呀=.= 然而发现这个东西还是特别实用的,和Java比起来它 ...

  7. FCKeditor使用方法技术详解

    转载自 http://www.cnblogs.com/cchyao/archive/2010/07/01/1769204.html 1.概述 FCKeditor是目前最优秀的可见即可得网页编辑器之一, ...

  8. C# this.invoke()作用 多线程操作UI

    Invoke()的作用是:在应用程序的主线程上执行指定的委托.一般应用:在辅助线程中修改UI线程( 主线程 )中对象的属性时,调用this.Invoke(); //测试的窗体 public class ...

  9. 我的android学习经历25

    android工程下R文件报错 今天我新建工程的时候,R文件报错,但是以前的文件并没有错误. 下面说一下我的情况: 我原来的工作区间是在D盘,后来我在E盘新建了一个工作区间,并且用E新建的工作区间,只 ...

  10. 去处HTML标签

    JavaScript去处HTML标签 function removeHTMLTag(str) { str = str.replace(/<\/?[^>]*>/g, ''); //去除 ...