最短路模板大全
例题:
解题思路:
各路板板摆上:
- SPFA 最短路(链式前向星)
int head[200010]={0},tot=0;
struct Gar
{
int x,y,w,next;
} e[500010];
void add(int x,int y,int w)
{
tot++;
e[tot].x=x;
e[tot].y=y;
e[tot].w=w;
e[tot].next=head[x];
head[x]=tot;
}
queue<int> q;
bool used[200010]={false};
int dis[200010];
void spaf()
{
q.push(s);
dis[s]=0;
used[s]=true; //判断该节点是否在队列中
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i;i=e[i].next)
{
if(dis[u]+e[i].w<dis[e[i].y]) //松弛
{
dis[e[i].y]=dis[u]+e[i].w;
if(!used[e[i].y]) q.push(e[i].y),used[e[i].y]=true; //若不在队列中则加入队列
}
}
used[u]=false; //出队啦
}
}
- SPFA手打队列(邻接表)
vector<pair<int,int> > g[10010];
int q[200010],h=1,t=1;
bool used[200010]={false};
int dis[200010];
void spaf()
{
q[t]=s;
t++;
dis[s]=0;
used[s]=true;
while(h<t)
{
int u=q[h];
h=(h+1)%200000; //循环
for(int i=0;i<g[u].size();i++)
{
if(dis[u]+g[u][i].second<dis[g[u][i].first])
{
dis[g[u][i].first]=dis[u]+g[u][i].second;
if(!used[g[u][i].first]) q[t]=g[u][i].first,t=(t+1)%200000,used[g[u][i].first]=true;
}
}
used[u]=false;
}
}
- dij堆优化(链式前向星)
int dis[1000010]={0};
bool vis[1000010]={false};
int head[1000010],tot=0;
struct Gar
{
int x,y,w,next;
} e[2000010];
void add(int x,int y,int w)
{
tot++;
e[tot].x=x;
e[tot].y=y;
e[tot].w=w;
e[tot].next=head[x];
head[x]=tot;
}
priority_queue<pair<int,int> > q;
void dij()
{
q.push(make_pair(0,s));
dis[s]=0;
while(!q.empty())
{
pair<int,int> u;
u=q.top();
q.pop();
int d=-u.first,id=u.second;
if(vis[id]) continue; //若当前点已经被松弛过了那么他肯定是最优的,因此跳过
vis[id]=true;
// if(dis[id]!=d) continue; 上述条件等价于这个
//这些判断不影响正确性,但是提升了速度
for(int i=head[id];i;i=e[i].next)
{
int di=dis[id]+e[i].w;
if(dis[e[i].y]>di)
{
dis[e[i].y]=di;
q.push(make_pair(-dis[e[i].y],e[i].y));
}
}
}
}
- Floyed 算法(邻接矩阵)
for(int k=1;k<=n;k++) //每局中转点
{
for(int i=1;i<=n;i++) //枚举起点
{
for(int j=1;j<=n;j++) //枚举终点
{
if(dis[i][j]>dis[i][k]+dis[k][j]) //松弛
dis[i][j]=dis[i][k]+dis[k][j];
if(i==j) dis[i][j]=0; //自己到自己当然不需要步数
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!