[模板]
void SPFA(int s){
for (int i = 1; i <= n; i ++) dis[i] = oo, vis[i] = 0;
dis[s] = 0; vis[s] = 1;
head = -1; tail = 0; q[1] = s;//初始化
while ( head!=tail ){
head ++;
if ( head>n ) head = 0;
if ( dis[head]>dis[tail] ) swap(q[head],tail) ;//lgj的迷之优化
v = q[head];
vis[v] = 0;//队首并释放标记
for (int i = 1; i <= n; i ++){//松弛v能到达的每一个节点
if ( map[v][i] && dis[i]>dis[v]+map[v][i] ){
dis[i] = dis[v] + map[v][i];
if ( !vis[i] ) {//若当前节点未入队则加入队列中
tail ++;
if ( tail>n ) tail = 0;
q[tail] = i;
vis[i]++;
}
}
}
}
}