#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MaxN = 1e6;
int dis[MaxN + 5] , m , n , a[MaxN + 5] , Inque[MaxN + 5] ,seq[MaxN + 5];
int all , pre[MaxN + 5] , other[MaxN + 5] , last[MaxN + 5] , cost[MaxN + 5];
void Build(int x , int y , int w)
{
pre[++all] = last[x];
last[x] = all;
other[all] = y;
cost[all] = w;
}
void spfa(int s)
{
int head , tail , now , ed , dr;
head = tail = 1;//头和尾的指向
seq[head] = s;//头指向s
for(int i = 1 ; i <= n ; i++){
if(i == s) dis[i] = 0;//当前点到当前点为0
else dis[i] = 1 << 30;//其他为无穷大
}
Inque[head] = 1;//把头加进来
while(head <= tail){//如果头不大于尾巴
now = seq[head];//当前点为队首
ed = last[now]; //当前点的最后一条边
while(ed != -1){//如果还有边
dr = other[ed]; //当前边的最后一个点
if(dis[now] + cost[ed] < dis[dr]){//能更新
dis[dr] = dis[now] + cost[ed];
if(!Inque[dr]){//如果不在队里面
Inque[dr] = 1;
seq[++tail] = dr;//加入队尾巴
}
}
ed = pre[ed];//
}
Inque[now] = 0;//出队
head++;//
}
}
int main()
{
all = -1;
memset(last , - 1 , sizeof(last));
//各种建图
Build(i - 1 , i , 1);
Build(i , i - 1 , 1);
spfa(1);//1为起点,dis为距离
for(int i = 1 ; i <= n ; i++) printf("%d ",dis[i]);
return 0;
}
spfa模板
最新推荐文章于 2023-06-18 13:52:14 发布