题目链接:Candies POJ - 3159
题目大意:满足b-a<=c就可以被小朋友a接受。输出n最多能比1多多少个糖;这道一题一定要用stack栈,用队列一直超时,还需要创建一个数组判断该点是不是最短路,在下面代码中我所用book 数组表示此点是否已是最短路,其他是SPFA模板
#include<stdio.h>
#include<string.h>
#include<stack>//stack更节约时间,
#include<iostream>
#include<algorithm>
using namespace std;
int inf=0x3f3f3f3f;
const int maxn=1e6+50;
int dis[maxn];
int v[maxn],w[maxn],u[maxn];
int first[maxn],next[maxn];
int book[maxn];
int n,m,num;
struct s
{
int u,v,w;
}s1[maxn];
void add(int a,int b,int c)
{
v[num]=b;
w[num]=c;
next[num]=first[a];
first[a]=num;
num++;
}
void spfa(int x)
{
int i;
stack<int>q;
memset(dis,inf,sizeof(dis));
memset(book,0,sizeof(book));
dis[x]=0;
q.push(x);
book[x]=1;//book表示此点是否已是最短路
while(!q.empty())
{
int u=q.top();
q.pop();
book[u]=0;
for(i=first[u];i!=-1;i=next[i])
{
if(dis[v[i]]>dis[u]+w[i])//判断是否松弛成功
{
dis[v[i]]=dis[u]+w[i];//更新dis的值
//q.push(v[i]);//入队
if(!book[v[i]])
{
book[v[i]]=1;
q.push(v[i]);
}
}
}
}
}
int main()
{
int t,i,j,k;
scanf("%d%d",&n,&m);
memset(first,-1,sizeof(first));
num=0;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&s1[i].u,&s1[i].v,&s1[i].w);
add(s1[i].u,s1[i].v,s1[i].w);
}
spfa(1);
cout<<dis[n]<<endl;
}