题目

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. DataRow数组转换DataTable

    public DataTable ToDataTable(DataRow[] rows) { if (rows == null || rows.Length == 0) return null; Da ...

  2. JAVA基础知识之网络编程——-使用MutilcastSocket实现多点广播

    IP多点广播原理 设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看作一个组,当客户需要发送和接受信息时,加入到该组即可. IP协议为多点广播提供了一批特殊的IP地址,范围是224.0.0 ...

  3. JAVA fundamentals of exception handling mechanism

    Agenda Three Categories Of Exceptions Exceptions Hierarchy try-catch-finally block The try-with-reso ...

  4. HashMap原理详解

    HashMap 概述 HashMap 是基于哈希表的 Map 接口的非同步实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.此类不保证映射的顺序,特别是它不保证该顺序恒久不 ...

  5. Android中的sharedUserId属性详解

    在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 ...

  6. js实现元素边框闪烁功能

    <body> <input type="text" value="test" onclick="flash(this)"& ...

  7. GCD之dispatch queue深入浅出

    GCD之dispatch queue深入浅出 http://blog.csdn.net/samuelltk/article/details/9452203

  8. js 定位到某个锚点

    js 定位到某个锚点 html页面内可以设置锚点,锚点定义 <a name="firstAnchor">&nsbp;</a> 锚点使用 <a  ...

  9. netstat -ano,查看已占用端口,结束已被占用的端口,ntsd,关闭任务管理器杀不了的进程

    cmd——回车,输入netstat -ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不 ...

  10. 51NOD1433] 0和5(数论,规律)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1433 数论关于3的倍数有一个推论,就是能被9整除的数的各位和都 ...