该算法使用一个队列进行维护,最初将源点加入到队列,每次取出一个元素,并且对与其相邻的点都进行松弛,若某个点松弛成功再入队,vis数组是表示在队内的元素。
定义部分:
const int Max = 0x3f3f3f3f;
int poi_num, edge_num, cnt;
struct edge{ //链式前向星的边结构体
int v;
int nex;
int len;
}e[105];
int id[105]; //i为起点的第一条边的位置
int d[105]; //起点到第i个点的距离
bool vis[105]; //队列内的数
int Time[105]; //每个点的松弛次数,判断负环
加边函数:
void add(int bgn, int nd, int len){ //无向图加两遍
e[cnt].v = nd;
e[cnt].len = len;
e[cnt].nex = id[bgn];
id[bgn] = cnt++;
}
初始化部分: