选择合适的最短路--hdu3499
[题目链接](http://acm.hdu.edu.cn/showproblem.php?pid=3499)
刚看见题目,哦?不就是个最短路么,来,跑一下dijkstra记录最长路除个二就完事了 ,但是。。。。。。

走红色的路是最佳方案,但是蓝色路的最短路跟短,我想错了;
不久我又想,把每个边枚举一下,减半一个边,就跑一次dijstra,但是这太慢了,O(m*m*logm)
拜拜了您內
后来看了看网上的大佬,其实也可以枚举嘛,只要每一次枚举都是O(1)。显然需要预处理一下,正线边跑一次,反向边跑一次

这样就可以了
听说还可以分层图,没看懂,猜测了一下原理

就这样了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
const int maxn = 5e5 + 100;
const long long INF = 1e12;
struct Node {
ll p, val;
Node(ll a, ll b) :p(a), val(b) {}
};
bool operator <(const Node a, const Node b) {
if (a.val > b.val) return true;
else return false;
}
int n, m;
ll d1[maxn];
ll d2[maxn];
int vis[maxn];
vector<Node>G[maxn];
void insert(int be, int en, int len) {
G[be].push_back(Node(en, len));
return;
}
int dijstra(ll *dis, int be) {
for (int i = 0; i <= n; i++) {
vis[i] = 0;
dis[i] = INF;
}
dis[be] = 0;
priority_queue<Node>que;
que.push(Node(be, 0));
while (!que.empty()) {
Node ans = que.top();
que.pop();
if (vis[ans.p] == 0) {
vis[ans.p] = 1;
for (int i = 0; i < G[ans.p].size(); i++) {
int p = G[ans.p][i].p;
if (!vis[p] && dis[p] > dis[ans.p] + G[ans.p][i].val) {
dis[p] = dis[ans.p] + G[ans.p][i].val;
que.push(Node(p, dis[p]));
}
}
}
}
return 0;
}
map<string, int>ins;
ll be_[maxn];
ll en_[maxn];
ll len_[maxn];
int main() {
while (~scanf("%d %d", &n, &m)) {
ins.clear();//可得记得清空啊
string be, en;
ll len = 0;
int c = 0;
int cnt = 1;
while (m--) {
cin >> be >> en;
scanf("%lld", &len);
if (ins[be] == 0) ins[be] = cnt++;
if (ins[en] == 0) ins[en] = cnt++;
be_[c] = ins[be];
en_[c] = ins[en];
len_[c] = len;
c++;
insert(ins[en], ins[be], len);
}
cin >> be >> en;
if (ins[be] == 0) ins[be] = cnt++;
if (ins[en] == 0) ins[en] = cnt++;
dijstra(d2, ins[en]);
for (int i = 0; i <= n; i++) G[i].clear();
for (int i = 0; i < c; i++) {
insert(be_[i], en_[i], len_[i]);
}
dijstra(d1, ins[be]);
ll ans = d1[ins[en]];
if (ans == INF) {
printf("-1\n");
continue;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < G[i].size(); j++) {
ans = min(ans, d1[i] + d2[G[i][j].p] + G[i][j].val / 2);//每个顶点刷出来边试探
}
} printf("%lld\n", ans);
for (int i = 0; i <= n; i++) G[i].clear();
}
return 0;
}
选择合适的最短路--hdu3499的更多相关文章
- NoSQL系列:选择合适的数据库
NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 阻抗失衡 关系模型和内存中的数据结构不匹配 采用更为方便的数据交互方式提升开发效率 待处理的数据量很大 数据量超过关系型数据库的承载能力 ...
- 为MySQL选择合适的备份方式
数据库的备份是极其重要的事情.如果没有备份,遇到下列情况就会抓狂: UPDATE or DELETE whitout where… table was DROPPed accidentally… IN ...
- (转)NoSQL系列:选择合适的数据库
内容目录: 为什么使用NoSQL数据库? 键值数据库 文档数据库 列族数据库 图数据库 附思维导图 参考 NoSQL系列:选择合适的数据库 为什么使用NoSQL数据库? 阻抗失衡 关系模型和内存中的数 ...
- (转载)通过dbgrideh 从数据集中选择合适的记录
通过dbgrideh 从数据集中选择合适的记录 //---------------------------------------------------------// 通过dbgrideh 从数据 ...
- 【转】app后端如何选择合适的数据库产品
转自:http://blog.csdn.net/newjueqi/article/details/44003503 app后端的开发中,经常要面临的一个问题是:数据放在哪里? mysql ?redis ...
- 谈谈数据库中MyISAM与InnoDB区别 针对业务类型选择合适的表
MyISAM:这个是默认类型,它是基于传统的ISAM类型, ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法. ...
- 如何选择合适的PHP开发框架
PHP作为一门成熟的WEB应用开发语言,已经深受广大开发者的青睐.与此同时,各式各样的PHP开发框架也从出不穷,面对如此多而且良莠不齐的开发框架,开发者们想必都会眼花缭乱,不知道该选择用哪个.其实并没 ...
- MySQL如何选择合适的引擎以及引擎的转换。
我们怎么选择合适的引擎?这里简单归纳一句话:"除非需要用到某些InnoDB不具备的特性,并且没有其他办法可以替代,否则都应该优先选择InnoDB引擎." 除非万不得已,否则不建议混 ...
- 为MySQL选择合适的备份方式[转]
原文链接:http://nettedfish.sinaapp.com/blog/2013/05/31/choose-suitable-backup-strategy-for-mysql/ 数据库的备份 ...
随机推荐
- 转载:ubuntu 下的dpkg 的用法
dpkg是一个Debian的一个命令行工具,它可以用来安装.删除.构建和管理Debian的软件包. 下面是它的一些命令解释: 1)安装软件 命令行:dpkg -i <.deb file name ...
- 使用css制作三角
1. 字符实现三角效果关于字符实现三角我早在09年的时候就介绍了:使用字符实现兼容性的圆角尖角效果.一转眼两年过去了,这个技术开始被越来越多的人所熟知.使用的字符是正棱形“◆”字符,编码表示为◆ . ...
- 7-3三个模块 hashlib ,logging,configparser和序列化
一 hashlib 主要用于字符串加密 1 import hashlib md5obj=hashlib.md5() # 实例化一个md5摘要算法的对象 md5obj.update('alex3714' ...
- oracle函数 NLS_LOWER(x[,y])
[功能]返回字符串并将字符串的变为小写; [参数]x字符型表达式 [参数]Nls_param可选,指定排序的方式(nls_sort=) . SCHINESE_RADICAL_M(部首.笔画) SCHI ...
- iOS学习--详解UIView的 contentStretch属性
通过实例和图片理解UIView的contentStretch属性 方法 通过一个图片建立一个简单的UIImageView 设置它的contentStretch属性 修改它的frame属性 观察 测试用 ...
- mysql数据库之多表查询
准备 ...
- DOM常用操作,Sass基础
一个元素的子元素个数ParentNode.childElementCount 只读属性返回一个无符号长整型数字,表示给定元素的子元素数. 取消当前事件e.preventDefault();有时候我们选 ...
- 读取Flex AIR应用程序设置
说明: 本人之前做过一年的Flex AIR移动跨平台开发,在之前学习过程中,一直是将笔记记在了Evernote上,有的笔记是自己写的,也有的笔记是在网上看到,顺手记下了的. 所以在这里声明下,如果在网 ...
- P1103 走迷宫三
题目描述 大魔王抓住了爱丽丝,将她丢进了一口枯井中,并堵住了井口. 爱丽丝在井底发现了一张地图,他发现他现在身处一个迷宫当中,从地图中可以发现,迷宫是一个N*M的矩形,爱丽丝身处迷宫的左上角,唯一的出 ...
- linux scull 中的设备注册
在内部, scull 使用一个 struct scull_dev 类型的结构表示每个设备. 这个结构定义为: struct scull_dev { struct scull_qset *data; ...