您的位置:首页 > 其它

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

2015-01-20 16:23 435 查看
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;
}
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
);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: