poj_3159 最短路
题目大意
有N个孩子(N<=3000)分糖果。有M个关系(M<=150,000)。每个关系形如:A B C 表示第B个学生比第A个学生多分到的糖果数目,不能超过C。求第N个学生最多比第1个学生能多分几个糖果
题目分析
题目求第N个学生可以比第1个学生多分糖果数目,假设有从第1个同学经过一系列关系,可以到达第N个同学,比如 存在路径1 1--->i1--->i2--->....ik--->N,表示同学i1比同学1最多多x1个糖果,同学i2比同学i1最多多x2个糖果....同学N比同学ik最多多xk+1个糖果; 还存在路径2 1--->j1-->j2.....-->jk--->N,表示同学j1比同学1最多多y1个糖果,同学j2比同学j1最多多y2个糖果....同学N比同学jk最多多jk+1个糖果...还存在路径3,4,5...
将各个同学视为图上的点,同学甲比乙最多多的糖果数视为甲到乙的边的长度。那么显然,同学N比同学1最多多的糖果数目为从1到N的最短路径,若大于最短路径,则观察从1到N的最短路径上经过的点,其中至少有相邻两点不满足要求(其中一个比另一个最多多x个糖果)。
题目转化为一个无负权边的无向图的单源最短路径问题,采用dijkstra算法解决。由于N^2 >> M,这是一个稀疏图,采用邻接矩阵存储。
题目实现(c++)
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
#define MAX_NODE 30005
#define INFINITE 1 << 30
struct Edge{
int vertex; //该边连接的下一个顶点
int dist; //边的长度
Edge(int v, int d) :
vertex(v), dist(d){};
};
vector<vector<Edge> >gGraph; //存放图 bool gUsed[MAX_NODE]; //判断点v是否已经获得从原点s到该点的最短距离
int gDist[MAX_NODE]; //存放原点s到该点的当前最短距离 struct Compare{ //用于优先队列的比较
bool operator()(const Edge& a, const Edge& b){
return a.dist > b.dist;
}
}; //注意,使用优先队列、set、map等结构时,注意合理的选择存放的元素,不要在push,pop的时候,改变已经存在于
//容器中的元素发生改变(因为要保证顺序性)
int Dijkstra(int s, int d, int n){
memset(gUsed, false, sizeof(gUsed));
priority_queue<Edge, vector<Edge>, Compare> pq;
for (int i = 1; i <= n; i++)
gDist[i] = INFINITE; gDist[s] = 0;
Edge e(s, 0);
pq.push(e);
while (!pq.empty()){
e = pq.top();
pq.pop();
if (gUsed[e.vertex]) //如果已经确定了从原点到该点的最短距离,则肯定也已经通过该点更新过了
//其他邻接点的最短距离,则之后再从队列中取出该点,直接跳过
continue; gUsed[e.vertex] = true;
if (e.vertex == d){
break;
}
for (int i = 0; i < gGraph[e.vertex].size(); i++){
Edge& next_e = gGraph[e.vertex][i];
if (!gUsed[next_e.vertex]){
if (gDist[next_e.vertex] > gDist[e.vertex] + e.dist){
gDist[next_e.vertex] = gDist[e.vertex] + e.dist; //更新邻接点,并放入队列
pq.push(Edge(next_e.vertex, gDist[next_e.vertex]));
}
}
}
}
return gDist[d];
}
int main(){
int n, m, u, v, c;
scanf("%d %d", &n, &m); gGraph.resize(n + 1);
for (int i = 0; i < m; i++){
scanf("%d %d %d", &u, &v, &c);
gGraph[u].push_back(Edge(v, c));
}
int result = Dijkstra(1, n, n);
printf("%d\n", result);
return 0;
}
poj_3159 最短路的更多相关文章
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Sicily 1031: Campus (最短路)
这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- bzoj1266最短路+最小割
本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 最短路(代码来源于kuangbin和百度)
最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...
- Javascript优化细节:短路表达式
什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...
- Python中三目计算符的正确用法及短路逻辑
今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...
随机推荐
- windows设置默认打印机
实现这个功能需要使用windows api [DllImport("winspool.drv")] public static extern bool SetDefaultPrin ...
- Java线程中断理解(interrupte)
Java线程之中,一个线程的生命周期分为:初始.就绪.运行.阻塞以及结束.当然,其中也可以有四种状态,初始.就绪.运行以及结束. 一般而言,可能有三种原因引起阻塞:等待阻塞.同步阻塞以及其他阻塞(睡眠 ...
- quick-cocos2dx-2.2.4环境搭建
1.Quick-Coco2d-x介绍 Quick-Coco2d-x是Cocos2d-x在Lua上的增强和扩展版本,廖宇雷廖大觉得官方Cocos2d-x的Lua版本不是太好用,于是便在官方Lua版本的基 ...
- SSH 限制
SSH 限制 限制 SSH 连接 通过使用用户.组和拒绝/允许条目限制 SSH 用户连接您的主机.还可以针对各个主机使用 TCP Wrappers. 评论 David Tansley, 系统管理员, ...
- 示例 Demo 工程和 API 参考链接
Camera Explorer:有关 Windows Phone8 中有关增强 Camera API 的使用.文章链接 Filter Effects:对拍摄的照片或者图片库中的照片应用 Nokia I ...
- Lucene用法10个小结 (zhuan)
http://www.cfanz.cn/index.PHP?c=article&a=read&id=303149 *********************************** ...
- Ubuntu打开core dump
输入ulimit -a 如果core file size为0,那就说明没有打开core dump,尽管你的程序crash的时候会显示core dumped,但实际上不会生成core file 输入ul ...
- 用广搜实现的spfa
用广搜实现的spfa,如果是用一般的最短路,会发现构图很麻烦,因为它不是路径带权值,而是自身带权值.写起来只要注意,在点出队列的生活将其标记为0,在要压入队列的时候,判断其标记是否为0,为0表示队列中 ...
- 一款jquery和css3实现的卡通人物动画特效
之前为大家分享了很多jquery和css3的动画实例.今天给大家带来一款非常炫的jquery和css3实现的卡通人物动画特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: < ...
- Excel TargetRange.Validation为空的
做Excel的时候遇到过TargetRange.Validation为空,赋值类似空指针一样的情况. 这样的情况,不懂Excel调试了好久,最后还知道,这个对象需要自己去定义才能够进行赋值, 这样定义 ...