题目大意

有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 最短路的更多相关文章

  1. bzoj1001--最大流转最短路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...

  2. 【USACO 3.2】Sweet Butter(最短路)

    题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...

  3. Sicily 1031: Campus (最短路)

    这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...

  4. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  5. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...

  6. HDU2433 BFS最短路

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. 最短路(代码来源于kuangbin和百度)

    最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...

  8. Javascript优化细节:短路表达式

    什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...

  9. Python中三目计算符的正确用法及短路逻辑

    今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...

随机推荐

  1. STL中map错误用法一例

    [GBK]0G's fans( me ) 13:34:26typedef struct _TX_DATA{ int len; unsigned char buff[0x100]; } TX_DATA, ...

  2. DevExpress中GridControl列转义的实现方法

    /// <summary> /// CustomColumnDisplayText Helper /// </summary> /// <param name=" ...

  3. Mysql 数据库数值类型详解

    MySQL 支持所有标准SQL 中的数值类型,其中包括严格数值类型(INTEGER.SMALLINT.DECIMAL 和NUMERIC),以及近似数值数据类型(FLOAT.REAL 和DOUBLE P ...

  4. vue组件调用(用npm安装)

    vue用webpack打包方式新建项目,注意刚开始可以先关闭路由和代码错误检测功能 1.建立了一个Hi.vue的组件 <template> <div>Hi~~{{msg}}-- ...

  5. DDMS android 开发工具-----dump View Hierarchy for UI automator

    今天又发现一个好工具  dump View Hierarchy 对学习UI布局非常有优点,操作也非常easy的.直接上图说话了 watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  6. 怎样在tsung中使用动态參数(二)

    上一篇博客说过,在配置getOrderId请求时,能够用动态变量(order_id)解析和捕获服务端返回的json对象.这个变量能够作为接下来的订单确认请求(Confirm)的输入參数.看一下Conf ...

  7. pow(x,y)函数的实现算法(递归函数)

    函数pow(x,y)实现运算x^y,即x的y次方,这里x和y都为整数. 算法的基本思想是,减少乘法次数,重复利用结算结果,例如: x^4,如果逐个相乘的话,需要四次乘法.如果我们这样分解(x^2)*( ...

  8. hadoop修改

    https://github.com/medcl/elasticsearch-analysis-ik/releases hadoop-/etc/hadoop/core-site.xml <con ...

  9. Composer fails to download http json files on "update", not a network issue, https fine

    "repositories": [ { "packagist": false }, { "type": "composer&quo ...

  10. iOS 开发如何入门

    iOS 开发如何入门 新人如何入门 上一篇文章的回复中,很多读者让我推荐入门图书.其实我觉得每个人可能有自己喜欢的学习方式,我习惯的不一定适合你.不过我可以分享一下我当时是如何学习 iOS 开发的. ...