枚举固然可以,但是我还是想看看分层图。。。。

如本题所述 ,从上图到下图就是一个折扣的过程,上部分只有一种办法下去,下部分图没有办法去上面,该模型十分的巧妙啊!!!

下面我来演示一下自己改的样例吧

紫色路线是最短的,从上往下的路就是打折的路,类似bfs搜索,上面的所有点都可以下来,但是dijkstra只会只会保留最优的解

#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<map>
#include<string>
using namespace std;
#define maxn 500000+10
typedef long long ll;
const long long INF = 2e14;
struct Node {
int p, tmp;
ll val;
Node(int a, ll b,int t) :p(a), val(b),tmp(t) {}
};
int n, m;
vector<Node>G[maxn];
bool operator < (const Node a, const Node b) {
if (a.val > b.val) return true;
else return false;
}
int vis[maxn][2];
ll dis[maxn][2];
void insert(int be, int en, ll len) {
G[be].push_back(Node(en, len, 0));
G[be].push_back(Node(en, len, 1));
return;
}
int dijkstra(int be) {
priority_queue<Node>que;
for (int i = 0; i <= n; i++) {
for (int j = 0; j < 2; j++) {
vis[i][j] = 0;
dis[i][j] = INF;
}
}
dis[be][0] = 0;
dis[be][1] = 0;
que.push(Node(be, 0, 0));
while (!que.empty()) {
Node ans = que.top();
que.pop();
if (vis[ans.p][ans.tmp] == 0) {
vis[ans.p][ans.tmp] = 1;
for (int i = 0; i < G[ans.p].size(); i++) {
int p = G[ans.p][i].p;
int t = G[ans.p][i].tmp;//确定位置
if (!vis[p][t] && dis[p][t] > dis[ans.p][t] + G[ans.p][i].val) {
dis[p][t] = G[ans.p][i].val + dis[ans.p][t];
que.push(Node(p, dis[p][t], t));
} if (t == 0) {//可以下来的话
if (!vis[p][1] && dis[p][1] > dis[ans.p][0] + G[ans.p][i].val / 2) {//从上面穿下来所以是0加给1
dis[p][1] = dis[ans.p][0] + G[ans.p][i].val/2;
que.push(Node(p, dis[p][1], 1));
}
}
}
}
}
return 0;
}
map<string, int>ins;
int main() {
while (~scanf("%d %d", &n, &m)) {
ins.clear();
for (int i = 0; i <= n; i++)G[i].clear();
string be, en;
ll len;
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++;
insert(ins[be], ins[en], len);
}
cin >> be >> en;
if (ins[be] == 0) ins[be] = cnt++;
if (ins[en] == 0) ins[en] = cnt++;
dijkstra(ins[be]);
if (dis[ins[en]][1] == INF) printf("-1\n");
else printf("%lld\n", dis[ins[en]][1]);
}
return 0;
}

  

hdu3499---玄学的分层图的更多相关文章

  1. 【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

    3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status] ...

  2. ACdream 1017 [分层图][网络流]

    /* 大连热身C题 不要低头,不要放弃,不要气馁,不要慌张 题意: 给一个城市路线图,给定起点给定终点.有n个货物从起点运送到终点.城市的边是无向边. 每个货物每天如果通过某条路,那么这天这条路只能运 ...

  3. poj3635Full Tank?[分层图最短路]

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Descri ...

  4. HDU 5669 线段树优化建图+分层图最短路

    用线段树维护建图,即把用线段树把每个区间都标号了,Tree1中子节点有到达父节点的单向边,Tree2中父节点有到达子节点的单向边. 每次将源插入Tree1,汇插入Tree2,中间用临时节点相连.那么T ...

  5. BZOJ 2763 分层图最短路

    突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 #include <cstdio> #include <algorithm> #include ...

  6. ZOJ-2364 Data Transmission 分层图阻塞流 Dinic+贪心预流

    题意:给定一个分层图,即只能够在相邻层次之间流动,给定了各个顶点的层次.要求输出一个阻塞流. 分析:该题直接Dinic求最大流TLE了,网上说采用Isap也TLE,而最大流中的最高标号预流推进(HLP ...

  7. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  8. 【网络流24题】 No.14 孤岛营救问题 (分层图最短路)

    [题意] 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛, 营救被敌军俘虏的大兵瑞恩. 瑞恩被关押在一个迷宫里, 迷宫地形复杂, 但幸好麦克得到了迷宫的地形图. 迷宫的外形是 ...

  9. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  10. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 647  Solved: 348[Submit][Sta ...

随机推荐

  1. hdu 3652 【数位dp】

    hdu 3652 题意:求1到n中包含'13'('13'不一定连续)且能被13整除的数的个数. 这是我第一道比较了能看懂的数位dp.定义状态dp[pos][res][sta]表示处理到第pos位,模的 ...

  2. SDUT-1479_数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九:行编辑器 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的行编辑程序的功能是:接受用 ...

  3. IO NIO AIO及常用框架概述

    概述 nio 同步: 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步: 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需 ...

  4. Hbase数据模型 时间戳

  5. js this详解

    This的定义: 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用. this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是 ...

  6. AtCoder Regular Contest 060

    C - 高橋君とカード / Tak and Cards 思路:dp,先说说我想的,我写的dp数组是dp[i][j][k],表示从前i个数字中,选择j个数字,平均值为k,则dp[i][j][k] = d ...

  7. 通过GDB重新获得进程的输出

    有时通过SecureCRT或者Putty远程ssh到主机上执行某个进程,因长时间没有交互导致ssh断链,此时该进程由init进程收留.该进程的输出也就无法获得了. 这种情况下,可以利用gdb重新获得该 ...

  8. SuperSocket从服务器端主动发起连接

    你可以从服务器端主动连接客户端, 连接建立之后的网络通信处理将和客户端主动建立连接的处理方式一样. var activeConnector = appServer as IActiveConnecto ...

  9. PHP导入导出Excel方法小结

    基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件 ...

  10. H3C 数据封装与解封装