链式前向星
typedef struct bian//储存边
{
int to;//边指向的下一个点
int w;//该边的权值
int next;//下一条边的编号
} bian;
bian a[M<<1];
int pre[M],cent=0,d;//用于构图,cent边的编号,pre前一条边的编号
void qianxiangxin(int v,int u,int k)//v弧尾,u弧头,k边的权值
{
a[cent].to=u;
a[cent].w=k;
a[cent].next=pre[v];
pre[v]=cent++;
}
SPFA
keyblog.cn/article-21.html
(写得挺好的)
bool SPFA(int s,int n)
{
queue<int > q;
memset(vis,0,sizeof(vis));
memset(ven,0x3f3f3f,sizeof(ven));
memset(nums,0,sizeof(nums));
ven[s]=0;
vis[s]=1;
nums[s]++;
q.push(s);
while(!q.empty())
{
int x=q.front();
q.pop();
vis[x]=0;//不在队中
for(int i=pre[x]; ~i; i=a[i].next)
{
int y=a[i].to;
if(ven[y]>ven[x]+a[i].w)//松弛
{
ven[y]=ven[x]+a[i].w;
if(!vis[y])
{
q.push(y);
vis[y]=1;
nums[y]++;
if(nums[y]>n)//入队次数不超过n-1次,否则有负环
return false;
}
}
}
}
return true;
}```