题意:赛车背景,给你n个节点,m条边的图以及起点和终点;其中每条边的信息包括u(起点),v(终点),a(开启的时间),b(关闭的时间),d(通过这条道路的时间);求最短通过的时间,其中车在进的时候,保证时间足够能走出去;否则需要等一些分钟;

思路:dij真是万能的,把固定权值改成动态的即可;

其中改变权值的语句很关键,并且推出的规律有个前提就是保证道路打开的时间一定大于等于通过该条道路的时间,否则相当于道路不通,被我忽略了,WA了3遍,可惜;

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <sstream>
#include <queue>
#include <vector>
#define repu(i,a,b) for(int i=a;i<b;i++)
using namespace std;
#define N 330
int v[N],t[N];
const int maxn=;
const int INF=0x3f3f3f3f;
int rode[maxn];
int c[N][N],p[N][N];
int st = ,ed,k;
struct Edge
{
int u,v,t1,t2,d;
Edge(int u, int v, int t1,int t2, int d):u(u),v(v),t1(t1),t2(t2),d(d) {}
};
struct qnode
{
int u;
int d;
qnode(int u, int d):u(u), d(d) {}
bool operator < (const qnode a)const
{
return d > a.d;
}
}; int GetDist(int t, Edge e)
{
t %= (e.t1 + e.t2);
if(e.d <= e.t1)///坑,一开始没加上
{
if(t >= e.t1 || e.t1 - t < e.d)
return e.t1 +e.t2 -t+e.d;
else if(e.d + t <= e.t1)
return e.d;
}
return INF;
}
struct Dijkstra
{
int n;
vector<int> G[maxn];
vector<Edge> edge;
int d[maxn];
bool vis[maxn];
void init(int n)
{
this->n=n;
for(int i=; i<=n; i++)
{
G[i].clear();
vis[i]=;
d[i]=INF;
}
edge.clear();
}
void AddEdge(int u, int v,int c,int e, int f)
{
G[u].push_back(edge.size());
edge.push_back(Edge(u,v,c,e,f));
}
int dijkstra(int st,int ed)
{
int sum = ;
memset(vis, , sizeof vis);
repu(i,,n+)
d[i] = INF;
priority_queue<qnode> q;
d[st]=;
q.push(qnode(st, ));
while(!q.empty())
{
qnode x=q.top();
q.pop();
if(vis[x.u])
continue ;
vis[x.u]=true;
if(x.u == ed)
return d[ed];
for(int i=; i<G[x.u].size(); i++)
{
Edge& e=edge[G[x.u][i]];
int vv = GetDist(d[x.u], e);///推这时候的权值
int tmp=d[x.u]+vv;///过这条边需要的时间
if(d[e.v] > tmp)
{
d[e.v]=tmp;
q.push(qnode(e.v, d[e.v]));
}
/// if(d[e.v] > d[x.u]+e.d)///原句
/// {
/// d[e.v]=d[x.u]+e.d;
/// q.push(qnode(e.v, d[e.v]));
/// }
}
}
return d[ed];
}
} dij;
int main()
{
int n,m,kase =;
while(~scanf("%d%d%d%d",&m,&n,&st,&ed))
{
dij.init(m);
memset(t,,sizeof(t));
int a,b,f,c,e;
repu(i,,n)
{
scanf("%d%d%d%d%d",&a,&b,&c,&e,&f);
dij.AddEdge(a,b,c,e,f);
}
dij.dijkstra(st,ed);
printf("Case %d: %d\n",kase++,dij.d[ed]);
}
return ;
}

UVA 12661(动态权值+最短路,dij)的更多相关文章

  1. Wormholes 最短路判断有无负权值

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  2. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

  3. luogu3224 永无乡(动态开点,权值线段树合并)

    luogu3224 永无乡(动态开点,权值线段树合并) 永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示.某些 ...

  4. uva 1411 Ants (权值和最小的完美匹配---KM算法)

    uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...

  5. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...

  6. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  7. hdu1245 两个权值的最短路

    题意:       求s到t的最短路,如果路径相同求那么要求另一个权值尽可能的小. 思路:       水题,就是spfa的比较那个地方多了一个可以更新的机会,当(s_x[xin] > s_x[ ...

  8. UVA 11090 Going in Cycle!! 环平均权值(bellman-ford,spfa,二分)

    题意: 给定一个n个点m条边的带权有向图,求平均权值最小的回路的平均权值? 思路: 首先,图中得有环的存在才有解,其次再解决这个最小平均权值为多少.一般这种就是二分猜平均权值了,因为环在哪也难以找出来 ...

  9. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

随机推荐

  1. EventBus使用详解(一)——初步使用EventBus

    一.概述 EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间 ...

  2. Chrom 浏览器一些命令

    https://webkit.org/build-tools/  开发环境搭建 开源:http://www.17ky.net/kyxm/4_0_3_2_0_0/ http://www.chromium ...

  3. [问题2015S14] 复旦高等代数 II(14级)每周一题(第十五教学周)

    [问题2015S14]  设 \(J=\begin{pmatrix} 0 & I_n \\ -I_n & 0 \\ \end{pmatrix}\), \(A\) 为 \(2n\) 阶实 ...

  4. php手册杂记

    1, strcmp()是比较两个字符串的大小,两个字符串相同时返回0,第一个字符串大于第二个字符串时返回一个正值,否则返回负值.比较两个字符串的算法是:逐个比较两个串中对应的字符,字符大小按照ASCI ...

  5. 【原创】Capture CIS利用Access数据库建立封装库说明

    1.在服务器端建立新空间,方便封装库以及数据库的归档存放 服务器路径:\\192.168.1.234\Share\STG_LIB,文件夹内容如下,其中Datesheet存放物料数据手册,Pcb_Lib ...

  6. URL的格式

    URL RFC:  http://www.ietf.org/rfc/rfc1738.txt URI RFC: http://www.ietf.org/rfc/rfc2396.txt 转自:  http ...

  7. UITableViewCell的cell重用原理

    iOS设备的内存有限,如果用UITableView显示成千上万条数据, 就需要成千上万个UITableViewCell对象的话, 那将会耗尽iOS设备的内存.要解决该问题,需要重用UITableVie ...

  8. 运维神器Chef简单介绍和安装笔记

    首先大概解释一下Chef Chef有三个重要的概念:(如上图所示) 它们的合作关系大致是这样的, Workstation把资源或者说是一些要被运行的命令上传到Chef-Server上, Nodes自动 ...

  9. 【树莓派】树莓派移动网络连接(配置4G网卡)

    1.识别上网卡 使用命令lsusb,如果能够识别则可以继续往下. 2.安装网卡驱动程序 上网卡一般都会带有2个功能,一个是虚拟光驱,用来安装驱动程序:另一个是进行网络连接的modem. 在Linux下 ...

  10. Android 检查手机网络是否可用

    添加网络状态权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 代 ...