首页 > 其他分享 >spfa 详解

spfa 详解

时间:2024-01-27 09:03:15浏览次数:22  
标签:输出 int vis spfa 详解 号点 dis

算法基础


 

模板题


 


第1题     spfa最短路练习 查看测评数据信息

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible。数据保证不存在负权回路。1≤n,m≤100000 ,图中涉及边长绝对值均不超过 10000。
输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 impossible。

输入/输出例子1

输入:

3 3

1 2 5

2 3 -3

1 3 4

输出:

2

样例解释

#include <bits/stdc++.h>
using namespace std;
 
const int N=1e5+5;
struct edge
{
	int v, w;
};
int n, m, u1, v1, w1, dis[N], vis[N];
vector<edge> a[N];
queue<int> q;
void spfa(int s) //很像bfs
{
	memset(dis, 63, sizeof dis);
	memset(vis, 0, sizeof vis);
	dis[s]=0;
	q.push(s);
	
	while (!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		
		for (int i=0; i<a[u].size(); i++) //扩散到的点
		{
			int v=a[u][i].v, w=a[u][i].w;
			if (dis[v]>dis[u]+w) //松弛
			{
				dis[v]=dis[u]+w;
				if (!vis[v]) q.push(v), vis[v]=1; //防止重复入队
			}
		}
	}
}
int main()
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=m; i++)
	{
		scanf("%d%d%d", &u1, &v1, &w1);
		a[u1].push_back({v1, w1});
	}    
	spfa(1);
	
	if (dis[n]==dis[0]) printf("impossible");
	else printf("%d", dis[n]);
    return 0;
}

 


第2题     spfa判断负环 查看测评数据信息

给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。请你判断图中是否存在负权回路。1≤n≤2000 ,1≤m≤100000,图中涉及边长绝对值均不超过 10000。
输入格式

第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式

如果图中存在负权回路,则输出 Yes,否则输出 No。

输入/输出例子1

输入:

3 3

1 2 -1

2 3 4

3 1 -4

输出:

Yes

样例解释



#include <bits/stdc++.h>
using namespace std;
 
const int N=1e5+5;
struct edge
{
	int v, w;
};
int n, m, u1, v1, w1, dis[N], vis[N], cnt[N];
vector<edge> a[N];
queue<int> q;
bool spfa(int s)
{
	memset(dis, 63, sizeof dis);
	memset(vis, 0, sizeof vis);
	memset(cnt, 0, sizeof cnt);
	dis[s]=0;
	cnt[s]=1;
	q.push(s);
	
	while (!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=0;
		
		for (int i=0; i<a[u].size(); i++)
		{
			int v=a[u][i].v, w=a[u][i].w;
			if (dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				if (!vis[v]) 
				{
					q.push(v), vis[v]=1, cnt[v]++;
					if (cnt[v]>n) //入队超过n次,必定有负环
						return true;
				}
			}
		}
	}
	return false;
}
int main()
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=m; i++)
	{
		scanf("%d%d%d", &u1, &v1, &w1);
		a[u1].push_back({v1, w1});
	}    
	if (spfa(1)) printf("Yes");
	else printf("No");
	
    return 0;
}

 

标签:输出,int,vis,spfa,详解,号点,dis
From: https://www.cnblogs.com/didiao233/p/17991060

相关文章

  • floyd 详解
    解析  模板  第1题    floyd练习查看测评数据信息给定一个n个点m条边的有向图,图中可能存在重边和自环,边权可能为负数。再给定k个询问,每个询问包含两个整数x和y,表示查询从点x到点y的最短距离,如果路径不存在,则输出impossible。数据保证图中不存在......
  • 详解SpringCloud之远程方法调用神器Fegin
    第1章:引言咱们作为Java程序员,在微服务领域里,SpringCloud可谓是个耳熟能详的大名。它提供了一套完整的微服务解决方案,其中就包括了服务间的通信。在这个微服务中,有一个成员特别引人注意,它就是Feign。那Feign到底是什么呢?简单来说,Feign是一个声明式的Web服务客户端,它让编写Web服......
  • 详解pip install国内镜像
    下面是“pipinstall使用国内镜像的方法示例”的完整攻略。1.为什么需要使用国内镜像pip是Python的一个包管理工具,可以方便地安装、升级和删除Python包。但是pip默认从pypi.org下载包,这个网站的服务器位于海外,经常因网络和权限问题出现下载失败的情况,给开发带来不便。同时,由于......
  • @PostConstruct用法详解介绍
    1.@PostConstruct介绍定义:在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法。说明:被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法......
  • ARM指针寄存器——堆栈指针寄存器SP、程序计数器PC、连接寄存器LR详解
    堆栈的实现方法        在随机存储器区划出一块区域作为堆栈区,数据可以一个个顺序地存入(压入)到这个区域之中,这个过程称为‘压栈’(push)。通常用一个指针(堆栈指针SP—StackPointer)实现做一次调整,SP总指向最后一个压入堆栈的数据所在的数据单元(栈顶)。从堆......
  • STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing viola
    1.什么是STA?     STA(静态时序分析)是时序验证的一种方法,用于计算和分析电路是否满足时序约束的要求。 2.为什么需要STA?    电路能否正常工作,其本质上是受最长逻辑通路(即关键路径)的限制,以及受芯片中存储器件的物理约束或工作环境的影响。    为了保......
  • 搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战
    搜索推荐DeepFM算法详解:算法原理、代码实现、比赛实战可以说,DeepFM是目前最受欢迎的CTR预估模型之一,不仅是在交流群中被大家提及最多的,同时也是在面试中最多被提及的:1、Deepfm的原理,DeepFM是一个模型还是代表了一类模型,DeepFM对FM做了什么样的改进,FM的公式如何化简并求......
  • 单点登录(SSO)实现详解!!!
    单点登录是什么?你是怎么理解的?单点登录是如何实现的普通登录提到单点登录,首先可以想到传统登录,通过登录页面根据用户名查询用户信息,判断密码是否正确,正确则将用户信息写到session,访问的时候通过从session中获取用户信息,判断是否已登录,登录则允许访问。普通登录的缺点由于sessi......
  • Activiti七大接口,28张表详解
    Activiti七大接口,28张表详解7大接口RepositoryService:提供管理流程部署和流程定义API。RuntimeService:提供运行时流程实例进行管理与控制API。TaskService:提供流程任务管理API。IdentityService:提供对流程用户数据进行管理的API,包括用户组、用户及用户–组关系。ManagementServ......
  • 如何获取微信的版本号详解【附完整源码】
    前两天群里有人问到这个问题,我想着在网上找个教程发给他,没想到这玩意还挺新鲜?网上基本上找不到实质性的回答...关于这个问题,其实挺简单的,微信的版本号其实就写在注册表中,读取它就完事了~打开注册列表找到【计算机\HKEY_CURRENT_USER\Software\Tencent\WeChat】,就看的到版本号......