spfa算法用FIFO队列代替BellmanFord算法的循环检查,所以在效率上是相当不错的;
struct Edge
{
int from;//出发结点
int to;//终止结点
int dist;//距离
Edge(int u,int v,int d):from(u),to(v),dist(d){}
};
//一些重要的参数和初始化
int n;//n为结点数
int m;//m为边的编号
vector<Edge> edges;
vector<int> G[maxn];
int d[maxn];//源点到各个点的距离
int p[maxn];//最短路中的上一条弧
void init(int n)
{
this->n=n;
for(int i=0;i<n;++i)
{
G[i].clear();
}
edges.clear();
}
void AddEdge(int from,int to,int dist)
{
edges.push_back(Edge(from,to,dist));
m=edges.size();
//把边的编号压入,相当于邻接表
G[from].push_back(m-1);
}
bool bellman_ford(int s)//s为源点
{
queue<int> Q;
memset(inq,0,sizeof(inq));//inq[]代表是否已经在队列中
memset(cnt,0,sizeof(cnt));//cnt[]代表进入队列几次
for(int i=0;i<n;++i)
d[i]=INF; //d[i]为到源点的距离
d[s]=0;
inq[s]=true;
Q.push(s);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
inq[u]=fals