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);
}
}