码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-20 17:29:54      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

标签:

原文地址:http://www.cnblogs.com/sola1994/p/4236428.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!