http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808

题意:

Bobo 居住在大城市 ICPCCamp。

ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号。 m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟(即从 ai 到 bi 需要 ti 分钟,从 bi 到 ai 也需要 ti 分钟)。
众所周知,换乘线路很麻烦。如果乘坐第 i 段地铁来到地铁站 s,又乘坐第 j 段地铁离开地铁站 s,那么需要额外花费 |ci-cj | 分钟。注意,换乘只能在地铁站内进行。
Bobo 想知道从地铁站 1 到地铁站 n 所需要花费的最小时间。
 
思路:
因为一个点可能位于多条边中,然后边也是有属性的,这样的话,如果记录点的状态,当前可能是最优的,但是对于后面的点来说,由于还受边的影响,就不一定是最优的。
可以自己模拟一下下面这组数据:
 4 4
1 2 3 5
2 3 3 3
2 3 1 2
3 4 1 1

解决的办法有两种:一种是记录边的状态,另一种是拆点,一个点属于几条线段,就把它拆成几个点。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,ll> pll;
const int INF = 0x3f3f3f3f;
const int maxn=*1e5+;
const int mod=1e9+; int n, m;
ll ans; struct Edge
{
ll from, to, c, dist;
Edge(ll u, ll v, ll w, ll d) :from(u), to(v), c(w), dist(d){}
}; struct HeapNode
{
ll id , val;
HeapNode(ll x, ll y) :id(x), val(y){}
bool operator < (const HeapNode& rhs) const{
return val > rhs.val;
}
}; struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
ll d[maxn]; void init(int n)
{
this->n = n;
for (int i = ; i < n; i++) G[i].clear();
edges.clear();
} void AddEdges(int from, int to, int c, int dist)
{
edges.push_back(Edge(from,to,c,dist));
m = edges.size();
G[from].push_back((m - ));
} void dijkstra(int s)
{
priority_queue<HeapNode> Q;
for (int i = ; i<=m ; i++) d[i] = 1e18;
d[s] = ;
memset(done, , sizeof(done));
for(int i=;i<G[s].size();i++)
{
Edge& e=edges[G[s][i]];
d[G[s][i]]=e.dist;
Q.push(HeapNode(G[s][i],e.dist));
}
while (!Q.empty())
{
HeapNode x = Q.top(); Q.pop();
int id = x.id;
if (done[id]) continue;
done[id] = true;
int u=edges[id].to;
if(u==n-) ans=min(ans,d[id]); for (int i = ; i < G[u].size(); i++)
{
Edge& e = edges[G[u][i]];
if (d[G[u][i]] > d[id] + e.dist + abs(e.c-edges[id].c))
{
d[G[u][i]] = d[id] + e.dist + abs(e.c-edges[id].c);
Q.push(HeapNode(G[u][i],d[G[u][i]]));
}
}
}
}
}t; int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
t.init(n);
for(int i=;i<m;i++)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
a--; b--;
t.AddEdges(a,b,c,d);
t.AddEdges(b,a,c,d);
}
ans=1e18;
t.dijkstra();
cout<<ans<<endl;
}
return ;
}

CSU 1808 地铁(最短路变形)的更多相关文章

  1. CSU 1808 - 地铁 - [最短路变形]

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 Time limit: 5000 ms Memory limit: 13107 ...

  2. CSU 1808: 地铁 最短路

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 1808: 地铁 Time Limit: 5 SecMemory Limit: ...

  3. 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 题目大意: N个点M条无向边(N,M<=105),每条边属于某一条地铁Ci ...

  4. CSU 1808 地铁

    题意: ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟 ...

  5. CSU 1808 地铁 (Dijkstra)

    Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci ...

  6. POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)

    做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...

  7. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  8. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

  9. POJ-1797Heavy Transportation,最短路变形,用dijkstra稍加修改就可以了;

    Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K          Description Background  Hugo ...

随机推荐

  1. thinkpad X1 extreme 安装Ubuntu 18.04.2 LTS

    1.安装的时候需要禁用:nouveau.modeset=0 2.安装完成之后需要添加:acpi=off ,ro后面加上3,直接进入终端 3.启动之后:安装nvdia驱动 $ ubuntu-driver ...

  2. python排序函数sort()与sorted()区别

    sort是容器的函数:sort(cmp=None, key=None, reverse=False) sorted是python的内建函数:sorted(iterable, cmp=None, key ...

  3. hdu1181 (变形课)简单地dfs

    http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/F Description 呃......变形课上Harr ...

  4. 轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features & Match)

    http://www.cnblogs.com/xrwang/archive/2010/02/09/HowToUseContour.html 作者:王先荣 前言    轮廓是构成任何一个形状的边界或外形 ...

  5. iOS 网易彩票-6设置模块三(常用小功能)

    该篇文章中,用到很多iOS开发过程中常用的小功能,当前只是将这些功能集成到网易彩票的设置中.iOS-常用小功能介绍,请参考我的另一篇文章: iOS 常用小功能 总结:http://www.cnblog ...

  6. EasyUI写的登录界面

    <!DOCTYPE html><html> <head>        <meta charset="utf-8" />       ...

  7. JavaScript循环练习

    1.蓝球弹起的高度篮球从10米高的地方落下,每次弹起的高度是原来的0.3倍,问弹跳10次之后篮球的高度. <script type="text/javascript"> ...

  8. http://ttaa.210997.com/恶意修改主页

    嗯,,,,之前似乎写过关于篡改主页的文章. 但今天下了个游戏,然后不小心又出现了这个问题. 我先用原始的方式检测了一下(比如检索注册表之类的),但这个不奏效. 省略一些查看问题的方式. 最终得出:新的 ...

  9. ajax提交form(文本数据以及文件上传)

    $.ajax({ url: 'xxxx.do', type: 'POST', cache: false, data: new FormData($('.layui-form')[0]), proces ...

  10. uva1494 最小生成树--例题

    这题说的是n个城市 建路 使他们联通然后 , 可以使用一条超级的路这条路不计入总长,此时路长度为B, 这条路链接的两个城市人口与和为A+B, 然后计算出最大的A/B 解题 先生成一颗最小生成树,然后 ...