poj 3159 Candies(dijstra优化非vector写法)

题目链接:http://poj.org/problem?id=3159

题意:给n个人派糖果,给出m组数据,每组数据包含A,B,c 三个数,意思是A的糖果数比B少的个数不多于c,即B的糖果数 - A的糖果数<= c 。

最后求n比1最多多多少糖果。

可以从条件中的

B-A<=c及B<=A+c最后要达成这个条件就是要当B>A+c时B=A+c即可

所以差不多就是求最短路。这题中还有一些优化比如

if(vis[u]) continue;这个避免了u点的重复查找

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <cstdio>
#define inf 0X3f3f3f3f
using namespace std;
const int M = 2e5;
int n , m , a , b , c , dis[30010];
struct TnT {
    int u , v , w , next;
}T[M];
struct qnode{
    int v , c;
    qnode(int v , int c):v(v) , c(c){}
    bool operator < (const qnode &r) const{
        return c > r.c;
    }
};
int head[30010] , e;
void add(int u , int v , int w) {
    T[e].v = v;
    T[e].w = w;
    T[e].next = head[u];
    head[u] = e++;
}
bool vis[M];
void dij(int s) {
    priority_queue<qnode>q;
    memset(vis , false , sizeof(vis));
    q.push(qnode(s , 0));
    dis[s] = 0;
    while(!q.empty()) {
        int u = q.top().v;
        q.pop();
        if(vis[u])
            continue;
        vis[u] = true;
        for(int i = head[u] ; i != -1 ; i = T[i].next)  {
            int v = T[i].v , w = T[i].w;
            if(!vis[v] && dis[v] > dis[u] + w) {
                dis[v] = dis[u] + w;
                q.push(qnode(v , dis[v]));
            }
        }
    }
}
int main() {
    while(scanf("%d%d" , &n , &m) != EOF) {
        e = 0;
        for(int i = 1 ; i <= n ; i++) {
            dis[i] = inf;
            head[i] = -1;
        }
        for(int i = 1 ; i <= m ; i++) {
            scanf("%d%d%d" , &a , &b , &c);
            add(a , b , c);
        }
        dij(1);
        printf("%d\n" , dis[n]);
    }
    return 0;
}
时间: 2024-10-06 04:23:18

poj 3159 Candies(dijstra优化非vector写法)的相关文章

[2016-04-08][POJ][3159][Candies]

时间:2016-04-08 18:05:09 星期五 题目编号:[2016-04-08][POJ][3159][Candies] 题目大意:n个小孩,m条信息,每条信息a ,b ,c,表示b小孩得到的糖不能比a小孩c个,问n小孩比1小孩最多能多多少个, 分析:直接就是求1到n的最短路(如果不是最短路,那么其他边,总有一种情况不能满足最短路这条边的情况,),直接跑一次Dijkstra 遇到的问题:使用'vector'存图TLE了,改成用数组实现的邻接表才A #include <queue> #i

poj 3159 Candies

题目链接:http://poj.org/problem?id=3159 Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 22516   Accepted: 6047 Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought th

POJ 3159 Candies 差分约束

链接:http://poj.org/problem?id=3159 Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 24852   Accepted: 6737 Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the

POJ 3159 Candies(差分约束系统)

题目地址:POJ 3159 第一发差分约束的题..就当作最短路来做了...直接建图+spfa..不过我用的spfa+slf优化都超时..看了讨论区里的..把spfa换成栈就过了... 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include

poj 3159 Candies dijkstra + queue

题目链接: http://poj.org/searchproblem 题目大意: 飞天鼠是班长,一天班主任买了一大包糖果,要飞天鼠分发给大家,班里面有n个人,但是学生A认为学生B比自己多的糖果数目不应该大于c,如果不满足自己的条件,学生A就会向老师告状,在这个班级里面泰迪熊的编号是1,班长的编号是n,班长想和泰迪熊的糖果相差最大,问:在满足m个学生的要求后,班长与泰迪熊的糖果相差最大是多少? 解题思路: 差分约束系统,|Xa-Xb| <= c,我们假设Xa小于Xb,把糖果的最大差当成边权,因为要

SPFA/Dijkstra POJ 3159 Candies

题目传送门 题意:n个人发糖果,B 比 A 多 C的糖果,问最后第n个人比第一个人多多少的糖果 分析:最短路,Dijkstra 优先队列优化可过,SPFA竟然要用栈,队列超时! 代码: /************************************************ * Author :Running_Time * Created Time :2015-9-1 19:18:52 * File Name :POJ_3159.cpp ************************

(简单) POJ 3159 Candies,Dijkstra+差分约束。

Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher brought the kids of flymouse’s class a large bag of candies and had flymouse distribute them. All the kids loved candies very much and ofte

POJ 3159 Candies(SPFA+栈)差分约束

题目链接:http://poj.org/problem?id=3159 题意:给出m给 x 与y的关系.当中y的糖数不能比x的多c个.即y-x <= c  最后求fly[n]最多能比so[1] 多多少糖? 差分约束问题, 就是求1-n的最短路,  队列实现spfa 会超时了,改为栈实现,就可以 有负环时,用栈比队列快 数组开小了,不报RE,报超时 ,我晕 #include <iostream> #include <cstdlib> #include <cstdio>

poj 3159 candies (差分约束 spfa+stack)

http://poj.org/problem?id=3159 题意:一个班有n个人 每人分到若干糖果 且u的糖果数不能比v少w个 求第1个人与第n个人最大数量差 照着模板spfa+queue果断tle了 之后照着题解说的把queue改成stack就过了 但是还不明白为什么会快 而且如果用数组直接模拟会比stl更快 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm>