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;

}
View Code

 

#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;

}
View Code

 

你可能感兴趣的:(stack)