加载中…

返回上一页

最短路

floyed

枚举外层 k,再枚举内层 ij,这样就能得到从 ij 的最短路径. 它是多源最短路径算法.

时间复杂度 ​​O(n3).

inline void floyed()
{
	memset(dis,0x3f,sizeof(dis));for(rll i=1;i<=n;i++) dis[i][i]=0;
	for(rll k=1;k<=n;k++)
		for(rll i=1;i<=n;i++)
			for(rll j=1;j<=n;j++)
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}

dijkstra

基于贪心的算法,每次选择一条最短的路径的点继续往下递归.

时间复杂度 ​​O(n log n + E)E 是边数).

dijkstra单源最短路径算法,它不能处理负边权情况.

#define pll pair<ll,ll>
priority_queue<pll,vector<pll>,greater<pll> > q;

inline void dij(rll x)
{
	memset(dis,0x3f,sizeof(dis));
	dis[x]=0;q.push((pll) { x,0 });
	while(!q.empty())
	{
		rll t=q.top().second;q.pop();
		for(rll i=0;i<g[t].size();i++)
		{
			rll to=g[t][i].first;
			if(dis[to]>dis[t]+g[t][i].second)
				dis[to]=dis[t]+g[t][i].second,
				q.push((pll) { to,dis[to] });
		}
	}
}

spfa

关于 spfa:它死了.

把每一个点放进队列里,不断递归(队列)更新最短路径.

复杂度 ​​O(nE).

queue<ll> q;
bool fl[maxn];

inline void spfa(rll x)
{
	memset(dis,0x3f,sizeof(dis));dis[x]=0;q.push(x);fl[x]=1;
	while(!q.empty())
	{
		rll t=q.front();q.pop();fl[t]=0;
		for(rll i=0;i<g[t].size();i++)
		{
			rll to=g[t][i].first;
			if(dis[to]>dis[t]+g[t][i].second)
			{
				dis[to]=dis[t]+g[t][i].second;
				if(!fl[to]) { q.push(to),fl[to]=1; }
			}
		}
	}
}
posted @ 2022-10-05 16:14  1Liu  阅读(12)  评论(0)    收藏  举报