题解 P1807 【最长路_NOI导刊2010提高(07)】
用普通的SPFA就能过,就是要注意队列要开的大一些,不然会WA几个点,我自己因为队列开的小调了好久,程序在下方
代码中用数组模拟邻接表存边,存边时代码很精简,可以学习一下,我也是跟别人学的。
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=1505,MAXM=50005;
int firstEdge[MAXN],endPoint[MAXM],nextEdge[MAXM],p;
int myQueue[500005],tail=0,head=0,n,m,t;
int weight[MAXM],dist[MAXN];
int main()
{
cin>>n>>m;
for(int i=2;i<=n;i++)dist[i]=-1;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&t,&endPoint[i],&weight[i]);
nextEdge[i]=firstEdge[t]; firstEdge[t]=i;
};
myQueue[tail++]=1;
while(tail>head)
{
t=myQueue[head++];
p=firstEdge[t];
while(p)
{
if(dist[endPoint[p]]<dist[t]+weight[p])
{
dist[endPoint[p]]=dist[t]+weight[p];
myQueue[tail++]=endPoint[p];
};
p=nextEdge[p];
};
};
cout<<dist[n];
return 0;
}