851. spfa求最短路 - AcWing题库
852. spfa判断负环 - AcWing题库
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,k;
int h[N],e[N],idx,w[N],ne[N];
int q[N],tt=-1,hh=0;
void add(int a,int b,int c)
{
e[idx]=b;
ne[idx]=h[a];
w[idx]=c;
h[a]=idx++;
}
int d[N];
bool st[N];
void spfa()
{
memset(d,0x3f,sizeof d);
d[1]=0;
q[++tt]=1;
st[1]=1;
while(tt>=hh)
{
int a=q[hh++];
st[a]=0;//出队
for(int i=h[a];i!=-1;i=ne[i])
{
int j=e[i];
if(d[j]>d[a]+w[i])
{
d[j]=d[a]+w[i];
if(!st[j])
{
q[++tt]=j;
st[j]=1; //入队
}
}
}
}
}
signed main()
{ memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
spfa();
if(d[n] == 0x3f3f3f3f )
cout << "impossible";
else cout << d[n];
}
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,k;
int h[N],e[N],idx,w[N],ne[N];
int q[N],tt=-1,hh=0;
int cnt[N];
void add(int a,int b,int c)
{
e[idx]=b;
ne[idx]=h[a];
w[idx]=c;
h[a]=idx++;
}
int d[N];
bool st[N];
int spfa()
{
for(int i=1;i<=n;i++)
{
st[i]=1;
q[++tt]=i;
}
while(tt>=hh)
{
int a=q[hh++];
st[a]=0;//不在队列
for(int i=h[a];i!=-1;i=ne[i])//遍历
{
int j=e[i];
if(d[j]>d[a]+w[i])
{ cnt[j]=cnt[a]+1;
d[j]=d[a]+w[i];
if(cnt[j]>=n) return true;
if(!st[j])//如果不在队列
{
q[++tt]=j;
st[j]=1;
}
}
}
}
return false;
}
signed main()
{ memset(h,-1,sizeof h);
cin>>n>>m;
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
if(spfa())
cout<<"Yes";
else cout<<"No";
}