题目链接:https://vjudge.net/problem/POJ-3159
一道差分约束问题,首选用spfa来做,然而用队列实现spfa会超时,改用堆栈就AC了
听说有负环的情况下用堆栈更好,或者是dfs实现,这题的TLE就很迷
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
using namespace std;
const int N=30000+10;
const int M=150000+10;
const int inf=0x7f7f7f7f;
struct edge
{
int to;
int c;
int next;
};
bool vis[N];
int d[N];
edge g[M];
int head[N];
int n,m;
int main()
{
scanf("%d%d",&n,&m);
int a,b,c;
memset(d,inf,sizeof(d));
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
g[i].to=b;
g[i].c=c;
g[i].next=head[a];
head[a]=i;
}
stack<int> q;
memset(vis,false,sizeof(vis));
q.push(1);
d[1]=0;vis[1]=true;
while(!q.empty())
{
int pos=q.top();q.pop();
vis[pos]=false;
for(int i=head[pos];i!=-1;i=g[i].next)
{
int v=g[i].to;
int c=g[i].c;
if(d[v]>d[pos]+c)
{
d[v]=d[pos]+c;
if(!vis[v])
q.push(v);
vis[v]=true;
}
}
}
printf("%d\n",d[n]-d[1]);
return 0;
}