spfa模板
邻接表的建立
题意:
给出一个有向无环图,输出一条最长路长度
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node
{
int to,val,next;
} e[100005];
int n,m,x,y,val,cnt;
int in[10005],head[10005];
ll dis[10005];
queue<int>q;
void add(int x,int y,int v)
{
e[cnt].to=y;//to指向的点
e[cnt].val=v;
e[cnt].next=head[x];//上一条边编号
head[x]=cnt++;//出度边
}
void spfa(int s)
{
int u,v;
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=head[u]; i!=-1; i=e[i].next)
{
v=e[i].to;
if(dis[v]<dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
q.push(v);
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(in,0,sizeof(in));
memset(head,-1,sizeof(head));
memset(dis,0,sizeof(dis));
scanf("%d%d",&n,&m);
cnt=0;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&val);
add(x,y,val);
in[y]++;
}
for(int i=1; i<=n; i++)
{
if(in[i]==0)
spfa(i);
}
ll ans=-1;
for(int i=1; i<=n; i++)
{
ans=max(ans,dis[i]);
}
printf("%lld\n",ans);
}
}
SPFA算法详解与实现
本文深入探讨了SPFA算法的原理与应用,通过实例详细介绍了如何使用SPFA算法求解有向无环图中最长路径的问题。文章提供了完整的代码实现,并解释了邻接表的构建过程。
1116

被折叠的 条评论
为什么被折叠?



