struct edge
{
int u , v , w;
int next;
edge(int u , int v , int w)
{
this -> u = u;
this -> v = v;
this -> w = w;
}
edge(){}
};
int id; //当前边数
int head[maxn]; //记录头
edge E[maxn*3]; //邻接表存边
bool vis[maxn]; //标记数组
int c[maxn]; //记录是否出现负环
int ok;
int spfa(int s , int d[])
{
queue<int>q;
for(int i = 0 ; i <= out ; i ++) d[i] = 99999999;
d[s] = 0;
mem(c , 0);
mem(vis , 0);
q.push(s);
while(!q.empty())
{
int tmp = q.front();
q.pop();
vis[tmp] = 0;
for(int i = head[tmp] ; i > 0 ; i = E[i].next) //从当前节点开始找到所有能遍历的点
{
edge e = E[i];
if(d[tmp] + e.w < d[e.v]) //松弛,若s由tmp 到 v节点的距离小于s到v的距离
{
d[e.v] = d[tmp] + e.w;
if(!vis[e.v]) //若v未被访问 ,入队列
{
vis[e.v] = 1;
c[e.v]++;
if(c[e.v] >= out) return ok = 1; ///判断负环是否存在
q.push(e.v);
}
}
}
}
return ok;
}
void add(int u , int v , int w)
{
id++;
E[id] = edge(u , v , w);
E[id].next = head[u];
head[u] = id;
}
spfa ,就邻接表建图模板
最新推荐文章于 2023-01-02 17:52:56 发布