题解 P1807 【最长路_NOI导刊2010提高(07)】
既然Bellman-ford能过……
SPFA咋就没个代码呢……
反着搞最短路初始化和松弛就可以了……
另外肯定是单向边,不然就是类似最短路里的负权环一样,直接正无限上去了……
#include<cstdio>
#include<queue>
using namespace std;
int n,m,s,x,y,z,out,fh,cnt,top,head[1510],dis[1510];
bool done[1510];
char cc;
deque<int>q;
struct Edge
{
int to,next,dis;
}e[100010];
int read()//能读负数但是会变慢的读入优化
{
out=0,fh=1,cc=getchar();
while((cc<'0'||cc>'9')&&cc!='-'){cc=getchar();}
if(cc=='-'){fh=-1,cc=getchar();}
else{out=cc-'0',cc=getchar();}
while(cc>='0'&&cc<='9')
{
out=out*10+cc-'0',
cc=getchar();
}
return out*fh;
}
void add(int x,int y,int z)//增加单向边的操作
{
cnt++,e[cnt].next=head[x],e[cnt].to=y,e[cnt].dis=z,head[x]=cnt;
}
void SPFA(int s)
{
for(int i=1;i<=n;i++){dis[i]=-233333333;}
dis[s]=0,done[s]=1;
q.push_back(s);
while(!q.empty())
{
x=q.front();
q.pop_front();
for(int i=head[x];i;i=e[i].next)
{
y=e[i].to;
if(dis[y]<dis[x]+e[i].dis)
{
dis[y]=dis[x]+e[i].dis;
if(!done[y])
{
done[y]=1;
if(!q.empty())
{
if(dis[y]<dis[q.front()]){q.push_back(y);}
else{q.push_front(y);}
}
else{q.push_back(y);}
}
}
}
done[x]=0;
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++)
{
x=read(),y=read(),z=read();
add(x,y,z);
}
SPFA(1);
printf("%d",(dis[n]==-233333333?-1:dis[n]));//最后用三目判断一下是否还是初始值就好了……
return 0;
}