题意就是求1到n的最短路径
这个题的数据用SPFA算法,但是由于题目数据的原因,必须将队列换成栈来实现
SPFA算法每次从队首取出一个元素,检查与队首邻接的元素的dist数组是否可以更新,若可行更新,且该元素不在队列中,进行入队操作,重复上述步骤,直到对列为空。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
using namespace std;
int head[30005];
int dist[30005];
bool inqueue[30005];
struct Edge
{
int end;
int length;
int next;
}edge[150005];
int MAXDIS = 0x7fffffff;
void Input(int n)
{
int u,v,w;
memset(head,-1,sizeof(head));
for(int i = 0;i<n;i++)
{
scanf("%d %d %d",&u,&v,&w);
edge[i].end = v;
edge[i].length = w;
edge[i].next = head[u];
head[u] = i;
}
}
/*QUEUE SPFA
void SPFA(int n)
{
for(int i = 0;i<=n;i++)
{
dist[i] = MAXDIS;
inqueue[i] = false;
}
dist[1] = 0;
inqueue[1] = true;
queue<int> q;
q.push(1);
while(!q.empty())
{
int temp = q.front();
q.pop();
for(int i = head[temp];i!=-1;i=edge[i].next)
{
if(dist[temp]+edge[i].length<dist[edge[i].end])
{
dist[edge[i].end] = dist[temp]+edge[i].length;
if(!inqueue[edge[i].end])
{
inqueue[edge[i].end] = true;
q.push(edge[i].end);
}
}
}
inqueue[temp] = false;
}
}*/
//Stack SPFA
void SPFA(int n)
{
for(int i = 0;i<=n;i++)
{
dist[i] = MAXDIS;
inqueue[i] = false;
}
dist[1] = 0;
inqueue[1] = true;
stack<int> q;
q.push(1);
while(!q.empty())
{
int temp = q.top();
q.pop();
for(int i = head[temp];i!=-1;i=edge[i].next)
{
if(dist[temp]+edge[i].length<dist[edge[i].end])
{
dist[edge[i].end] = dist[temp]+edge[i].length;
if(!inqueue[edge[i].end])
{
inqueue[edge[i].end] = true;
q.push(edge[i].end);
}
}
}
inqueue[temp] = false;
}
}
int main()
{
int N,M;
scanf("%d %d",&N,&M);
Input(M);
SPFA(N);
printf("%d\n",dist[N]);
return 0;
}