首页 > 其他分享 >最小步数(图论建模)

最小步数(图论建模)

时间:2024-08-24 09:05:56浏览次数:12  
标签:小明 图论 int 建模 vis 质因数 步数 dis

第2题     最小步数 查看测评数据信息

小明来到了一个矩形迷官,每个房间写着一个数字。小明初始在左上角的房间,她准备前往该迷言的右下角房间,每次小明可以向右或者向下行走一步。另外,小明可以进行若干次传送,每次可以花费1的步数,前往和当前房间不互素的任意一个房间。现在,小明希望你求出从左上角走到右下角的最小步数。你能帮帮她吗?

输入格式

 

第一行两个整数n,m,表示迷宫有n行m列

接下来n行,每行m个数,a[i][j],表示每个房间的数字

1<=n,m<=500,1<=a[i][j]<=1e5

 

输出格式

 

一个整数

 

输入/输出例子1

输入:

3 3

1 2 3

2 3 3

3 4 5

 

输出:

3

 

样例解释

 

第一步,向右走一步,当前格子为2.

第二步,传送到第三行第二列的4.

第三步,向右走一步。

 

还是考的建模,要如何抽象的变成图论,建图

首先看到,如果暴力做,连每个点到每个点的边,是O(n^4)的,预处理的时候就炸了

所以我们还是,建立虚拟点!以节省复杂度

但是我们发现,只要两个点能连边,就是不互素,也就是至少有一个公共因数

但是因数比较多,我们可以考虑质因数。

因为质因数最对只需要最多遍历6个,就可以找完了。

我们分解质因数:
2 3 5 7 11 13

2*3*5*7*11*13>=1e5

一个数,如果有一个质因数,就和这个质因数点双向连边,这样就确保了“传送”功能

注意边权设置1,因为你要实现“传送”功能,就需要从这个点到质因数点,然后再从质因数点到别的点,要一来一回,花费边权就是2,具体为什么看下文。

然后点和别的点(向下,右扩展的点)连的的边权也是2,这样总体答案除2就行。

 

或者另外一种方法:

对于一个点x

  x->质因数点边权为1,质因数点->x边权为0

 

注意一下,要预处理每个数的质因数,不然在循环里面去找会炸。卡在这里好久。。

#include <bits/stdc++.h>
using namespace std;
const int N=600;

struct node
{
	int v, w;
	bool operator <(const node &A) const
	{
		return w>A.w;
	};
};
int n, m, c[N][N], vis2[N*N], zhi[N], cnt=0;
int dx[]={0, 1}, dy[]={1, 0};
int dis[N*N], vis[N*N];
vector<node> a[N*N];
vector<int> v[N][N];
priority_queue<node> q;
void dij()
{
	memset(dis, 63, sizeof dis);
	memset(vis, 0, sizeof vis);
	dis[1*501+1]=0;
	q.push({1*501+1, 0});
	
	while (!q.empty())
	{
		int u=q.top().v;
		q.pop();
		
		if (vis[u]) continue;
		vis[u]=1;
		
		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;
				q.push({v, dis[v]});
			}
		}
	}
}
int main()
{
	scanf("%d%d", &n, &m);
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++) scanf("%d", &c[i][j]);
	
	vis2[1]=1;
	for (int i=2; i*i<=350; i++)
		if (!vis2[i])
			for (int j=i*i; j<=350; j+=i)
				vis2[j]=1;
	
	for (int i=2; i<=350; i++) if (!vis2[i]) zhi[++cnt]=i;
	
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++)
		{
			for (int k=1; k<=cnt && zhi[k]*zhi[k]<=c[i][j]; k++)
				if (c[i][j]%zhi[k]==0) 
				{
					int t=c[i][j]/zhi[k];
					v[i][j].push_back(zhi[k]);
					if (zhi[k]!=t && !vis2[t]) v[i][j].push_back(t);
				}
			if (!vis2[c[i][j]]) v[i][j].push_back(c[i][j]);
		}	
	
	/*
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++)
		{
			printf("[%d, %d] : ", i, j);
			for (int k=0; k<v[i][j].size(); k++)
				printf("%d ", v[i][j][k]);
			puts("");
		}
	*/
	
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++)
		{
			for (int k=0; k<v[i][j].size(); k++)
			{
				a[i*501+j].push_back({v[i][j][k]+260000, 1});
				a[v[i][j][k]+260000].push_back({i*501+j, 1});
			}
			
			for (int k=0; k<2; k++)
			{
				int nx=i+dx[k], ny=j+dy[k];
				if (nx>=1 && nx<=n && ny>=1 && ny<=m)
				{
					a[i*501+j].push_back({nx*501+ny, 2});
					a[nx*501+ny].push_back({i*501+j, 2});
				}
			}
		}
			
	dij();
	
	printf("%d", dis[n*501+m]/2);
	return 0; 
}

  

 

 

标签:小明,图论,int,建模,vis,质因数,步数,dis
From: https://www.cnblogs.com/didiao233/p/18377348

相关文章

  • 「代码随想录算法训练营」第四十五天 | 图论 part3
    目录101.孤岛的总面积DFS思路BFS思路102.沉没孤岛103.水流问题104.建造最大岛屿101.孤岛的总面积题目链接:https://kamacoder.com/problempage.php?pid=1173文章讲解:https://programmercarl.com/kamacoder/0101.孤岛的总面积.html题目状态:看题解DFS思路思路:代码结构......
  • 【保奖资料】2024年数学建模国赛B题保奖思路获取入口(后续会更新)
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!现分享2022年数学建模国赛B题资料分享,供大家学习:B题公式和算法文档解释第一问根据题目可知以下几点无人机被动测距只能测得两个发射机的夹角,但是不能知道发射机位于接收机的绝对方位,因此......
  • 【保奖资料】2024年数学建模国赛B题保奖思路获取入口(后续会更新)
    您的点赞收藏是我继续更新的最大动力!一定要点击如下的卡片链接,那是获取资料的入口!现分享2022年数学建模国赛B题资料分享,供大家学习:B题公式和算法文档解释第一问根据题目可知以下几点无人机被动测距只能测得两个发射机的夹角,但是不能知道发射机位于接收机的绝对方位,因此......
  • UVM中的TLM(事务级建模)通信(1)
    1.验证平台内部的通信    我们希望在验证平台内部找到两个component之间适合通信的方法,在接触TLM之前,想到的方法无非有采用全局变量、通过config_db传输等等。然而全局变量因为安全性不高,是我们长期以来竭力避免使用的方法;config_db虽然相对安全,但需要拉入basetest的......
  • MATLAB进行神经网络建模的案例
    下面是一个使用MATLAB进行神经网络建模的案例,该案例涉及使用神经网络来逼近一个未知系统的输入输出关系。这个案例与您提到的学习资料中的实例类似,但我会简化并解释每个步骤。案例背景假设我们有一组输入和输出数据,我们希望通过建立一个神经网络模型来逼近这些数据之间的......
  • 图论
    最短路差分约束生成树AGC004D有\(n\)个城市,每个城市有一个传送点,都可以传送到唯一的一个城市,保证从任何位置出发经过若干次传送之后能够到达\(1\)号城市。现在希望修改一些点的目的地,使得从任何一点出发在传送\(K\)次之后恰好都能到达\(1\)号城市,求最少要改变目的地......
  • 达梦数据库定时同步数据
    文章目录前言一、DM数据迁移工具1.新建作业2.新建调度3.选择任务4.配置信息5.选择调度6.配置完成二、逻辑备份还原1.环境准备2.新建sh脚本3.编辑sh文件4.编辑Crontab5.查看定时任务6.其他三、相关报错1.创建SOCKET连接失败/网络通讯异常2.导出表对象已存在3.[警告]Er......
  • 「代码随想录算法训练营」第四十四天 | 图论 part2
    200.岛屿数量题目链接:https://leetcode.cn/problems/number-of-islands/description/文章讲解:https://programmercarl.com/kamacoder/0099.岛屿的数量深搜.html题目难度:中等题目状态:看题解思路一:深搜版方法dfs:参数:接受一个字符网格grid和当前坐标(r,c)。功能:......
  • 短视频图文带货:计划建模的深度解析与实践
    随着数字营销的快速发展,短视频图文带货已经成为了一种日益重要的营销手段。相较于传统的营销方式,短视频图文带货具有更高的互动性和传播性,能够更好地吸引和留住用户。然而,如何做好短视频图文带货并非易事。许多商家和品牌虽然投入了大量的人力物力,但最终效果并不理想。这其中的......
  • 【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink
    ......