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>
#include<cmath>
#include<queue>
#include<stack>
#define INF 10000000
using namespace std;
int n,m;
int d[30000+10];
struct Node
{
    int u,v,w;
};
Node node[150000+20];
int first[30000+20];
int next [150000+20];
int main()
{
    int i,j,k;
    int u,v,w;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        //memset(mat,0,sizeof(mat));
        for(i=2;i<=n;i++) d[i]=INF;
        d[1]=0;
        for(int i=1;i<=n;i++) first[i]=-1;
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);  //u+w>=v
            node[i].u=u;
            node[i].v=v;
            node[i].w=w;
            next[i]=first[u];
            first[u]=i;
        }
        int q[30000+10];
        int tot=0;
        bool inq[30000+10];
        memset(inq,0,sizeof(inq));
        q[tot++]=1;
        while(tot)
        {
            int x=q[--tot];
            inq[x]=false;
            for(int e=first[x];e!=-1;e=next[e])
            {
                if(d[node[e].v]>d[x]+node[e].w)
                {
                    d[node[e].v]=d[x]+node[e].w;
                    if(!inq[node[e].v])
                    {
                        inq[node[e].v]=true;
                        //q.push(node[e].v);
                        q[tot++]=node[e].v;
                    }
                }
            }
        }
        printf("%d\n",d[n]);
    }
    return 0;
}

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#define INF 10000000
using namespace std;
int n,m;
int d[30000+10];
struct Node
{
    int u,v,w;
};
Node node[150000+20];
int first[30000+20];
int next [150000+20];
int main()
{
    int i,j,k;
    int u,v,w;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        //memset(mat,0,sizeof(mat));
        for(i=2;i<=n;i++) d[i]=INF;
        d[1]=0;
        for(int i=1;i<=n;i++) first[i]=-1;
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);  //u+w>=v
            node[i].u=u;
            node[i].v=v;
            node[i].w=w;
            next[i]=first[u];
            first[u]=i;
        }
        stack<int> q;
        bool inq[30000+10];
        memset(inq,0,sizeof(inq));
        q.push(1);
        while(!q.empty())
        {
            int x=q.top(); q.pop();
            inq[x]=false;
            for(int e=first[x];e!=-1;e=next[e])
            {
                if(d[node[e].v]>d[x]+node[e].w)
                {
                    d[node[e].v]=d[x]+node[e].w;
                    if(!inq[node[e].v])
                    {
                        inq[node[e].v]=true;
                        q.push(node[e].v);
                    }
                }
            }
        }
        printf("%d\n",d[n]);
    }
    return 0;
}

时间: 2024-10-21 08:16:32

poj 3159 candies (差分约束 spfa+stack)的相关文章

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 3169 Layout (差分约束+SPFA)

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6832   Accepted: 3292 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a

POJ 1364 King 差分约束 找负环

嘛,虽然是一道水题+模板题,不过还是学到了很多东西的,记录一下. 首先题目给出的不等式是小于,但是差分约束系统只能处理小于等于的情况,所以要转化成小于等于的进行处理.对于整数处理方法非常简单= = 然后是找负环的情况,其实不需要考虑图连不连通,只要一开始就把所有的点的d置成0,然后都push进队列里面就好了. PS:这种方法同样可以用在处理多源点最短路问题上. #include <cstdio> #include <cstring> #include <cmath> #

ZOJ 2770 Burn the Linked Camp 差分约束+SPFA

第一道正儿八经的差分约束题 有排成一列的n个点,首先告诉你每个点的值最多是多少(最少显然要大于0),然后告诉你m段i,j,k,表示第i个点到第j个点的值的和至少有k,问你总和至少为多少. 要注意的是,告诉你的所有关系式都不要忘记建边,一开始漏了大于0的条件调半天o(╯□╰)o 不等式的形式是a-b<=c这样的= = 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <

POJ 1364 King --差分约束第一题

题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析:典型差分约束题,变换,令Ti = SUM(Xj) (0<=j<=i).  则表达式(1)可以看做T(a+b)-T(a-1) > k,也就是T(a-1)-T(a+b) < -k,又因为全是整数,所以T(a-1)-T(a+b) <= -k-1.  同理,(2)看做T(a+b)-T(

[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(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+链式前向星)

题目链接:http://poj.org/problem?id=3159 题目大意:给n个人派糖果,给出m组数据,每组数据包含A,B,C三个数,意思是A的糖果数比B少的个数不多于C,即B的糖果数 - A的糖果数<=C . 最后求n 比 1 最多多多少颗糖果. 解题思路:经典差分约束的题目,具体证明看这里<数与图的完美结合——浅析差分约束系统>. 不妨将糖果数当作距离,把相差的最大糖果数看成有向边AB的权值,我们得到 dis[B]-dis[A]<=w(A,B).看到这里,我们可以联想到