(Day11)算法复健运动for蓝桥杯-最短路
(Day11)算法复健运动for蓝桥杯-最短路
1. Dijkstra
真女人就要直接学时间优化版本的Dijkstra
(一般只能算一个点到其他边的最短路)比较局限的一种算法,不能计算负权的
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
const int N=1e5+9;
const int inf=2147483647;
struct node//存图
{
int t,net,w;
}e[5*N];
int dis[N],head[N],vis[N];
int tot=1;
void add(int x,int y,int w)
{
e[tot].t=y;
e[tot].net=head[x];
e[tot].w=w;
head[x]=tot++;
}
struct no
{
int q;//s到哪个点
int d;
bool operator<(const no &c)const{
return d>c.d;
}
};
void dij(int s)
{
priority_queue<no>qu;
no one;
one.q=s;
one.d=0;
qu.push(one);
while(!qu.empty())
{
no now=qu.top();
qu.pop();
int x=now.q;
if(vis[x])continue;//被当做过松弛的最佳点
vis[x]=1;
for(int i=head[x];i;i=e[i].net)
{
int to=e[i].t;
if(!vis[to]&&dis[to]>dis[x]+e[i].w)
{
dis[to]=dis[x]+e[i].w;
no nxt;
nxt.q=to;
nxt.d=dis[to];
qu.push(nxt);
}
}
}
}
int main()
{
int n,m,s;//点数,边数,起点
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
dis[i]=inf;
}
int x,y,w;
while(m--)
{
cin>>x>>y>>w;
add(x,y,w);
}
dis[s]=0;
dij(s);
for(int i=1;i<=n;i++)
{
cout<<dis[i]<<" ";
}
cout<<endl;
return 0;
}
2.Floyd
记住模板就行了
#include<stdio.h>
#include<algorithm>
#define inf 1000000000
using namespace std;
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int ch[209][209];
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
ch[i][j]=inf;
}
ch[i][i]=0;//这一句很重要,没有就WA
}
int a,b,x;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&x);
ch[a][b]=min(ch[a][b],x);
ch[b][a]=min(ch[b][a],x);
}
int s,t;
scanf("%d%d",&s,&t);
for(int k=0; k<n; k++)//k必须在最外层
{
for(int j=0; j<n; j++)
{
for(int i=0; i<n; i++)
{
if(ch[i][j]>ch[i][k]+ch[k][j])
{
ch[i][j]=ch[i][k]+ch[k][j];
}
}
}
}
if(ch[s][t]==inf)ch[s][t]=-1;
printf("%d\n",ch[s][t]);
}
return 0;
}
3. spfa
#include<bits/stdc++.h>
#define inf 2e9
using namespace std;
const int N=5e4+9;
int vis[N];
int head[N];
int dis[N];
int tot;
struct node
{
int t,w,net;
}e[N];
void add(int x,int y,int w)
{
e[tot].t=y;
e[tot].w=w;
e[tot].net=head[x];
head[x]=tot++;
}
void spfa()
{
dis[1]=0;
vis[1]=1;
queue<int>qu;
qu.push(1);
while(!qu.empty())
{
int now=qu.front();
qu.pop();
vis[now]=0;
for(int i=head[now];i;i=e[i].net)
{
int b=e[i].t;
if(dis[b]>dis[now]+e[i].w)
{
dis[b]=dis[now]+e[i].w;
if(!vis[b])
{
vis[b]=1;
qu.push(b);
}
}
}
}
}
int main()
{
tot=1;
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
dis[i]=inf;
}
int u,v,w;
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
spfa();
if(dis[n]==inf)
{
printf("-1\n");
}
else
{
printf("%d\n",dis[n]);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义