两点间有路径吗? (20 分)

对于给定的无向图以及图中的两个顶点,计算两个顶点所在的连通分量中的顶点数,并且判断这两个顶点之间是否有路径。

输入格式:

第一行是不超过20的正整数N,表示图有N个顶点,顶点的编号即0~N-1

接下来N行,是N*N的邻接矩阵,矩阵的元素间用空格分隔;

最后一行是用空格隔开的两个顶点编号vw

输出格式:

第一行输出v所在的连通分量的顶点数

第二行输出w所在的连通分量的顶点数

第三行,若vw之间有路径,则输出Yes,否则输出No

注意:当vw是同一个顶点时,认为vw之间是有路径的。

输入样例:

对于这个图: 

fig.jpg

8
0 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0
1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 3

结尾无空行

输出样例:

5
2
No

结尾无空行

 深搜

#include<iostream>
using namespace std;
int A[22][22];
int N;
int Visited[20];
int cnt;
int dfs(int a)
{
	Visited[a] = 1;
	cnt++;
	for(int i = 0;i<N;i++){
		if(A[i][a]==1){
			if(!Visited[i])
			dfs(i);
		}
	}
}
int main()
{
	cin>>N;
	for(int i = 0;i<N;i++)
	{
		for(int j = 0;j<N;j++)
		cin>>A[i][j];
	}
	int v,m;
	cin>>v>>m;
	int V,M;
	dfs(v);
	V = cnt;
	for(int i = 0;i<N;i++)Visited[i] = 0;
	cnt = 0;
	dfs(m);
	M = cnt;
	cout<<V<<endl<<M<<endl;
	if(Visited[v])cout<<"Yes";
	else cout<<"No";
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在强化学习中,求解两点最短路径可以使用一种算法称为Q-learning。Q-learning是一种基于值函数的强化学习算法,用于在一个有向图中找到两点之的最短路径。 首先,需要定义状态空和动作空。在这个问题中,状态空可以表示为图中的节点,动作空可以表示为从一个节点到另一个节点的边。 然后,需要初始化一个Q表,用于存储每个状态和动作的值。Q表的大小与状态空和动作空的大小相对应。 接下来,通过迭代更新Q值来学习最短路径。在每次迭代中,从起始节点开始,根据当前状态选择一个动作,并根据选择的动作更新Q值。更新Q值的公式如下: Q(s, a) = Q(s, a) + α * (R + γ * max(Q(s', a')) - Q(s, a)) 其中: - Q(s, a)是状态s和动作a的Q值。 - α是学习率,控制每次更新的幅度。 - R是在状态s执行动作a后获得的即时奖励。 - γ是折扣因子,用于衡量未来奖励的重要性。 - max(Q(s', a'))表示在下一个状态s'中选择最大Q值的动作a'。 重复执行这个过程直到收敛或达到预定的迭代次数。 最后,可以使用学习到的Q表来找到两点之的最短路径。从起始节点开始,选择具有最大Q值的动作,然后移动到下一个状态。重复这个过程直到到达目标节点。 这就是使用强化学习中的Q-learning算法来求解两点最短路径的基本步骤。当然,这只是一个简单的示例,实际应用中可能需要考虑更多的因素和优化策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值