首页 > 其他分享 >传递闭包

传递闭包

时间:2024-02-08 21:11:45浏览次数:24  
标签:闭包 begin end int 传递 ij cases

一、问题描述

B3611 【模板】传递闭包

二、问题简析

首先,要弄清楚传递闭包的定义,由题意:

一张图的邻接矩阵定义为一个 \(n\times n\) 的矩阵 \(A=(a_{ij})_{n\times n}\),其中

\[ a_{ij}=\left\{ \begin{aligned} 1,i\ 到\ j\ 存在直接连边\\ 0,i\ 到\ j\ 没有直接连边 \\ \end{aligned} \right. \]

一张图的传递闭包定义为一个 \(n\times n\) 的矩阵 \(B=(b_{ij})_{n\times n}\),其中

\[ b_{ij}=\left\{ \begin{aligned} 1,i\ 可以直接或间接到达\ j\\ 0,i\ 无法直接或间接到达\ j\\ \end{aligned} \right. \]


如果我们把参数的含义改变一下,就可以很容易地发现本题其实是多源最短路径问题。

名称 改变前 改变后
\(a_{ij} = 1\) \(i\) 到 \(j\) 有直接连边 \(e(i, j)\) 存在且权值为0
\(a_{ij} = 0\) \(i\) 到 \(j\) 无直接连边 \(e(i, j)\) 不存在
\(b_{ij} = 1\) \(i\) 可以直接或间接到达 \(j\) \(i\) 到 \(j\) 存在最短路径
\(b_{ij} = 0\) \(i\) 无法直接或间接到达 \(j\) \(i\) 到 \(j\) 不存在最短路径

因此,我们可以采取 \(Floyd-Warshall\) 解决。


三、本题代码

3.1 直接套用 \(Floyd-Warshall\) 模板

#include <bits/stdc++.h>

using namespace std;

#define MdX 103
#define INF 1e8

int n;
int d[MdX][MdX];

void solve(void)
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}

int main()
{
	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
		fill(begin(d[i]), end(d[i]), INF);

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
		{
			int a;
			scanf("%d", &a);
			if (a != 0)
			{
				d[i][j] = a;
			}
		}

	solve();

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (d[i][j] == INF)
				printf("%d ", 0);
			else
				printf("%d ", 1);
		}
		putchar('\n');
	}

	return 0;
}

注意:

  • 1、初始化连接矩阵时要格外注意,与要来的算法不太一样。令

\[d[i][j] = \begin{cases} e(i, j).w &, e(i, j)存在且 i \neq j \\ INF &,e(i, j)不存在或 i == j \end{cases} \]

输入为 1,表示边存在;输入为 0,表示边不存在。需要注意自环是不存在的。

  • 2、要输出得不是最短路径,而是传递闭包。令

\[\mathbf{printf} = \begin{cases} 1 &,d[i][j] \neq \mathbf{INF} \\ 0 &,d[i][j] == \mathbf{INF} \end{cases} \]


3.2 稍微改进一点

模板中,\(d[i][j] =\) \(i\) 到 \(j\) 的最短路径。现在,令

\[d[i][j] = \begin{cases} true &, i 可以到 j \\ false &, i 不可以到 j \end{cases} \]

\(Floyd-Warshall\) 的核心 d[i][j] = min(d[i][j], d[i][k] + d[k][j]),变成 d[i][j] |= d[i][k] & d[k][j]。可以这样理解:\(i\) 能否到 \(j\),有两种情况:1、\(i\) 能否直接到 \(j\);2、\(i\) 能否由 \(k\) 中转到 \(j\)。有一种成立,\(i\) 就能到 \(j\)。

#include <bits/stdc++.h>

using namespace std;

#define MAX 103

int n;
bool d[MAX][MAX];

void solve(void)
{
	for (int k = 1; k <= n; k++)
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				d[i][j] |= d[i][k] & d[k][j];
}

int main()
{
	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf("%d", &d[i][j]);

	solve();

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			printf("%d ", d[i][j]);
		putchar('\n');
	}

	return 0;
}

标签:闭包,begin,end,int,传递,ij,cases
From: https://www.cnblogs.com/hoyd/p/18012127

相关文章

  • 闭包的漏洞
    目录1.闭包的定义2.构成闭包的条件3.闭包的漏洞4.闭包的漏洞防止方法4.1判断法4.2置空法1.闭包的定义闭包就是能够读取其他函数内部变量的函数。在JavaScript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。本质上,闭包是将函......
  • ABP-VNext 用户权限管理系统实战03---动态api调用并传递token
    一、使用动态api的目的ABP可以自动创建C#API客户端代理来调用远程HTTP服务(RESTAPIS).通过这种方式,你不需要通过 HttpClient 或者其他低级的HTTP功能调用远程服务并获取数据.现在有两个服务:BackgroundJob服务要调用IdentityManagement服务,并在调用时传递token二、集成步骤1、......
  • 烽火传递
    看似很简单的单调队列优化DP但是如果状态是表示前\(i\)个烽火台被处理完的最小代价(即不知道最后一个烽火台在哪里)就无法降低复杂度因为假设你在区间\([i-m+1,i]\)中枚举最后一个烽火台(设为\(k\)),你前面的状态并不是\(f[k-1]\),因为此时\(k\)已经可以覆盖前面的一些烽火台,\(f[k-1]......
  • c# JS的onclick()方法参数中含有引号导致参数传递异常
    引号导致的问题主要是参数不正常的截取,因为参数中传递的引号可能会与前边包括方法名的引号对应解决这个问题的操作还是需要用到转义\,让html不解析解决方法:replace("\'","\\'")......
  • 浅谈闭包(防抖,节流,函数柯里化)
    闭包参考文章谈谈你对闭包的理解概念:(1)闭包就是引用了另一个函数的变量的函数(2)闭包一般是函数嵌套,一个函数返回另外一个函数,内部函数访问外部函数的变量就形成了一个闭包作用(优点):(3)闭包的优点是可以私有化变量,将变量私有化到函数内部,并在私有化的基础上进行数据保持......
  • 苹果安卓或实现 WiFi 消息传递 ;马斯克宣布首例人类接受脑机接口植入丨 RTE 开发者日报
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 微信小程序: 传递对象数据
    一、传递参数的页面wxml<viewclass="right"><viewclass="status"style="color:{{item.color}}">{{item.status}}</view>......
  • csharp 发布订阅 传递参数
    event_learn\Program.cs//定义一个派生自EventArgs的自定义类,用于封装数据publicclassMyEventArgs:EventArgs{//定义一个公共的字符串属性,用于存储和获取数据publicDateTime?EmitDate{get;set;}}//定义一个发布者类,它有一个MyEvent事件public......
  • vue父子组件数据传递props中Object和Array如何设置默认值
      props:{field:{type:String},index:{type:Number,default:0},isAble:{type:Boolean,default:true},rowData:{type:Object,default:function(){return{};......
  • mybatis 传递参数的7种方法
     文章目录1.第一种方式匿名参数顺序传递参数2.第二种方式使用@Param注解3.使用Map传递参数4.用过javabean传递多个参数5.直接使用JSON传递参数6.传递集合类型参数List、Set、Array7.参数类型为对象+集合在实际开发过程中,增删改查操作都要涉及到请求参数的传递,今天这节就集......