首页 > 代码库 > poj 3159 candies (差分约束 spfa+stack)

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 10000000using 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 10000000using 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

 

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