首页 > 其他分享 >考前复习——最短路

考前复习——最短路

时间:2023-06-15 16:56:30浏览次数:54  
标签:复习 考前 int 短路 负环 vis edge dis

Floyd

十分暴力方便的最短路算法
虽然复杂度较高,但好在有最短路的图都可以用它解决(即无负环)

int n,m;//n个节点 m条边

int mp[N][N];

void init_floyd()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			mp[i][j]=Inf;
		}
		mp[i][i]=0;
	}
}

void floyd()
{
	for(int k=1;k<=n;k++)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
                //以 k 为中间节点尝试优化 i 到 j 的路径
				if(mp[i][j]>mp[i][k]+mp[k][j])
					mp[i][j]=mp[i][k]+mp[k][j];
				//使用邻接矩阵原因如上 
			}
		}
	}
}

int main()
{
	cin>>n>>m;
	int u,v,w;
	init_floyd();
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		cin>>mp[u][v];
	}
	
	floyd();
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<mp[i][j]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
}

SPFA

在SPFA中 同一个点可能进出队列多次

即一个点被改进后会再次改进其他点

SPFA适用于存在负环的情况

存在负环 ——某个点入队次数超过N

不存在负环 ——得出最短路

需要注意的是,以 S 点为源点跑 SPFA 算法时,如果没有给出存在负环的结果,只能说明从 S 点出发不能抵达一个负环,而不能说明图上不存在负环。

int n,m;//n个节点 m条边
int s;//起点 

int dis[N],num[N];
bool vis[N];

struct node{
	int to,w,next;
}edge[N];
int head[N];
int cnt;

void init()
{
	for(int i=1;i<=n;i++)
		head[i]=-1,dis[i]=Inf;
	cnt=0;
}

void add(int u,int v,int w)//加边过程 
{
	edge[++cnt].to=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}

bool SPFA(int s)
{
	queue<int> q;
	memset(dis,0x3f,sizeof(dis));
	memset(num,0,sizeof(num));
	memset(vis,false,sizeof(vis));
	bool f=1;
	
	q.push(s);
	vis[s]=1;
	dis[s]=0;
	num[s]++;
	
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		for(int i=head[u];i!=-1;i=edge[i].next)
		{
			int v=edge[i].to;
			if(dis[v]>dis[u]+edge[i].w)
			{
				dis[v]=dis[u]+edge[i].w;
				if(!vis[v])
				{
					q.push(v);
					vis[v]=1;
					num[v]++;
				}
				if(num[v]>n)
				{
					f=0;
					break;
				}
			}
		}
		if(!f)break;
	}
	return f;
}

int main()
{
	cin>>n>>m;
	init();
	int u,v,w;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v>>w;
		add(u,v,-w);
	}
	if(SPFA(1))cout<<dis[n];
	else cout<<"存在负环!"; 
	return 0;
}

dijkstra

Dijkstra 是一种求解 非负权图 上单源最短路径的算法。

过程
将结点分成两个集合:已确定最短路长度的点集(记为 S 集合)的和未确定最短路长度的点集(记为 T 集合)。一开始所有的点都属于 T 集合。

初始化 dis(s)=0,其他点的 dis 均为 正无穷。

然后重复这些操作:

从 T 集合中,选取一个最短路长度最小的结点,移到 S 集合中。
对那些刚刚被加入 S 集合的结点的所有出边执行松弛操作。
直到 T 集合为空,算法结束。

点击查看代码
int n,m;//n个节点 m条边

int dis[N];
bool vis[N];
int cnt;

struct node{
	int to,w,next;
}edge[N];
int head[N];

struct priority{
	/*
	值得注意的是
	因为下文有直接赋值的语句
	所以顺序尽量保持原样 
	*/
	int ans;//该点对应的dis值
	int id;//该点编号
	bool operator <(const priority &x)const{
		return x.ans<ans;
	}//运算符重载 
};

priority_queue<priority> q;

void init()
{
	for(int i=1;i<=n;i++)
	{
		head[i]=-1;
	}
	cnt=0;
}

void add(int u,int v,int w)//加边过程 
{
	edge[++cnt].to=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}

void dijkstra(int s)
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=Inf;
		vis[i]=0;
	}
	dis[s]=0;
	q.push((priority){0,s});//‘直接赋值的语句’ 
	while(!q.empty())
	{
		priority temp=q.top();
		q.pop();
		int u=temp.id;
		if(!vis[u])
		{
			vis[u]=1;
			for(int i=head[u];i!=-1;i=edge[i].next)
			{
				int v=edge[i].to;
				if(dis[v]>dis[u]+edge[i].w)
				{
					dis[v]=dis[u]+edge[i].w;
					q.push((priority){dis[v],v});
				}
			}
		}
	}
}

int main()
{
	cin>>n>>m;
	int u,v,w;
	init();
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v>>w;
		add(u,v,w);
	}
	int s;
	cin>>s;
	dijkstra(s);
	for(int i=1;i<=n;i++)
	{
		cout<<dis[i]<<" ";
	}

	return 0;
}

标签:复习,考前,int,短路,负环,vis,edge,dis
From: https://www.cnblogs.com/pigAlg/p/17479606.html

相关文章

  • C++构造函数复习
    #include<iostream>usingnamespacestd;classElement{public:Element(inte=12):elem(e){cout<<"element1"<<endl;}intelem;};classArrayHelper{public:ArrayHelper(){......
  • 《数字逻辑电路》复习笔记
    其实还是计算机系的课比较适合写复习笔记emm数制和码制各种进制是什么意思:略进制间互相转换:10-2:%2取余,倒序就是二进制了2-8:三位一组化成8进制;8-2:每位扩充成三位2进制表示;(2-16同理)十进制数的二进制编码(BCD码):8421码:四位二进制码从高......
  • 复习题2
    一、选择题一、选择题​1、常用的设计模式可分为()。[单选题]A、创建型、结构型和行为型(正确答案)B、对象型、结构型和行为型C、过程型、创建型和结构型D、抽象型、接口型和实现型答案:A 2、设计模式的原理?()[单选题]A、面对实现......
  • 《交通规划》——python实现最短路分配方法
    《交通规划》——最短路分配方法说明:下面内容,将用python、networkx实现刘博航、杜胜品主编的《交通规划》P198页的例题,主要是实现最短路径分配方法。1.题目描述如下:2.networkx构建网络importnetworkxasnximportmatplotlib.pyplotasplt#带权重的边列表edges=[......
  • 考前复习——拓扑排序
    拓扑排序要解决的问题是给一个图的所有节点排序在一个DAG(有向无环图)中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点u到v的有向边(u,v),都可以有u在v的前面。注:有环的图无法给出拓扑排序因此也可以用这个性质判断图有无环intn,m;intin[N],out[N];/......
  • 2310考期最新【密训-考前3小时】中国古代文学作品选(二)
    为什么说《待漏院记》一文有很强的逻辑性?[1804简答](1)文章先由“勤”立说,引出待漏院,由待漏院转出“思”字,又由“思”字切入,描写贤、奸两类宰相的不同表现,最后以“慎”字作结,结,点明文章主旨。全文环环相扣,步步深入,具有很强的逻辑性。2.《雨霖铃》(寒蝉凄切)的艺术特色[1910简答......
  • 数学分析复习:Weierstrass 逼近定理, Müntz–Szász 定理
    本学期的“数学分析(不是实验班)”讲了一堆Approximationtheory,这是怎么绘事呢?定理1(Weierstrass).连续函数\(f\in\mathrmC[0,1]\)可被多项式一致逼近.对任意\(\varepsilon>0\)和\(x\in[0,1]\),设随机变量\(X\)服从二项分布\(\mathrmB(n,x)\),由Chebysh......
  • 数据库复习——数据库模式设计
    数据库模式设计如果不好会导致的问题:1.冗余2.导致数据一致性出现问题3.插入异常4.更新异常5.删除异常函数依赖函数依赖是指一个或多个属性的取值可以确定另一个属性的取值。具体地说,如果一个关系模式R中属性集合X的取值能唯一地确定属性集合Y的取值,那么我们......
  • 「学习笔记」严格次短路
    出题人说:“有最短路,还要有次短路。”于是,就有了次短路这个东西。与次小生成树一样,目前不知道有啥用。本文求的是严格次短路!变量n:点数;m:边数;e:vector存图;dis1:储存最短路;dis2:储存次短路。过程我们要利用dijkstra的贪心思想和松弛操作。dijkstra的贪心思想,就是用目前路......
  • Linux内核期末复习
    1、P22-252、P36、P165ret指令的作用:进程切换时用什么函数 _switch_to_函数如何理解怎么实现  3、gcc、gdb命令 gdb 堆栈汇编典型示例: 反汇编指令:  4、内嵌汇编(10号系统调用)#include<stdio.h>intmain(){longresult;longsys......