图论算法实例分析|趣味象棋

简介: 图论(graph theory)是数学的一个分支,以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

图论(graph theory)是数学的一个分支,以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

图论起源于一个非常经典的问题——柯尼斯堡(K-nigsberg)问题。1738年,瑞典数学家欧拉(Leonhard Euler)解决了柯尼斯堡问题,由此图论诞生,欧拉也成为图论的创始人。

1859年,英国数学家汉密尔顿发明了一种游戏: 用一个规则的实心十二面体的20个顶点标出世界著名的20个城市,要求游戏者找一条沿着各边通过每个顶点刚好一次的闭回路,即“绕行世界”。用图论的语言来说,游戏的目的是在十二面体的图中找出一个生成圈。这个生成圈后来被称为汉密尔顿回路。这个问题后来就叫作汉密尔顿问题。运筹学、计算机科学和编码理论中的很多问题都可以化为汉密尔顿问题,从而引起人们广泛的注意和研究。

image.png


# 01、实例分析:趣味象棋

问题描述:

比利和马克在玩一个游戏: 对一个N * M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得它们不能互相攻击,这当然很简单,但是马克限制了只有某些格子才可以放,比利还是很轻松地解决了这个问题,如图1所示。

image.png


■ 图1 趣味象棋

注意,不能放车的地方不影响车的互相攻击。

所以,现在马克想让比利解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是,某些格子若不允许放,就无法保证放尽量多的“车”,这样的格子被称作重要点。马克想让比利算出有多少个这样的重要点,你能解决这个问题吗?
输入:

输入包含多组数据。

第一行有三个数N、M、K(1< N, M ≤10001<K≤N * M),表示棋盘的高、宽,以及可以放“车”的格子数目。

接下来的K行描述了所有格子的信息: 每行两个数X和Y,表示这个格子在棋盘中的位置。

输出:

对输入的每组数据,按照如下格式输出:

Board T have C important blanks for L chessmen.

输入样例:


3 3 4
1 2
1 3
2 1
2 2
3 3 4
1 2
1 3
2 1
3 2

输出样例:

Board 1 have 0 important blanks for 2 chessmen.
Board 2 have 3 important blanks for 3 chessmen.

思路: 先考虑在棋盘上尽可能地放棋子,使得任意棋子不在同一行同一列,将棋盘的行看作左边的点集,将棋盘的列看作右边的点集,若某个格子(i,j)可行,就从左i连到右j,这个二分图的最大匹配即这个棋盘能放的最多棋子数。

现要找出二分图中有多少条关键边,很明显,关键边要在算出来的匹配中找,因此只需将棋盘点对应的边删除再求一次最大匹配,看匹配数是否减小,若减小了,则说明这个边即棋盘的点是关键的,输出即可。
参考程序:

#include<iostream>
#include<cstdio>
#include<cstdlib>
# include< string>
#include<cstring>
#include< cmath>
#include< ctime>
#include<algorithm>
#include< stack>
#include< queue>
# include<vector>
#include< set>
#include<map>
#define PI acos(-1.0)
#define E le-6
#define MOD 16007
#define INF Ox3f3f3f3f
#define N 10001
#define II long long
using namespace std;
int n,m,k;
bool visINl;
int linkINl;
bool GIN]IN;
bool dfs(int x) {
   
   
for(int y=1;y<=m;y++)[
if(G[x][y]&&!vis[y]){
   
   
vis[y]=true;
if(link[y]==-1  dfs(link[y])) [link[y]=x;
return true;
return false;
int hungarian()
i贸唇巴狈角经髓讫担鲍岸迸扳邦般埃半碟骨便哎斑肮拜拌柴爱挨艾绷焙编扮傲叭巴扒捌箔谍0;
for(int i=1;i<=n;i++)[
memset(vis,false,sizeof(vis)) ;if(dfs(i) )ans++;
return ans;
int main()f
int Case=1;
while(scanf("ddd",&n,&m,&k) !=EOF&&(n+m+ k)){
   
   memset(G,false,sizeof(G) ) ;memset(link,-1,sizeof(link)) ;
while(k--){
   
   
int x,y;
scanf("d号d",&x,&y) ;G[x][y]=true;
int tot=hungarian() ;
int key=0;
for(int i=1;i<=n;i++){
   
   for(int j=1;j<=m;j++)[if(G[i][i])(G[il[j]=false;
memset(link,-1,sizeof(link));
int ans=hungarian() ;
if(ans<tot)
key+ + ;
G[il[jl=true;
printf("Board %d have d important blanks for d chessmen.\n",Case++key,tot);
return 0;
目录
相关文章
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
872 4
|
11月前
|
机器学习/深度学习 边缘计算 算法
NOMA和OFDMA优化算法分析
NOMA和OFDMA优化算法分析
518 127
|
8月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
442 3
|
8月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
148 0
|
10月前
|
编解码 算法 5G
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
MIMO雷达空间谱估计中Capon算法与MUSIC算法的对比分析及实现
876 2
|
10月前
|
人工智能 自然语言处理 算法
2025 年 7 月境内深度合成服务算法备案情况分析报告
2025年7月,中央网信办发布第十二批深度合成算法备案信息,全国389款产品通过备案,服务提供者占比超七成。截至7月14日,全国累计备案达3834款,覆盖文本、图像、音视频等多模态场景,广泛应用于生活服务、医疗、金融等领域。广东以135款居首,数字人、AI客服等C端应用主导,民营企业成主力,国企聚焦公共服务。随着AI政策推动,备案已成为AI产品合规上线关键环节。
|
9月前
|
机器学习/深度学习 算法 5G
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
【MUSIC、最大似然与克拉美-罗下界】MUSIC与ESPRIT 算法来估计到达角(AoA),并尝试推导克拉美-罗下界(CRLB)以分析其性能研究(Matlab代码实现)
589 0
|
算法 Python
Apriori算法的Python实例演示
经过运行,你会看到一些集合出现,每个集合的支持度也会给出。这些集合就是你想要的,经常一起被购买的商品组合。不要忘记,`min_support`参数将决定频繁项集的数量和大小,你可以根据自己的需要进行更改。
432 18
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
282 14
|
自然语言处理 算法 安全
境内深度合成服务算法备案通过名单分析报告
本报告基于《境内深度合成服务算法备案通过名单》,分析了2023年6月至2025年3月公布的10批备案数据,涵盖属地分布、行业应用及产品形式等多个维度。报告显示,深度合成算法主要集中于经济发达地区,如北京、广东、上海等地,涉及教育、医疗、金融、娱乐等多行业。未来趋势显示技术将向多模态融合、行业定制化和安全合规方向发展。建议企业加强技术研发、拓展应用场景、关注政策动态,以在深度合成领域抢占先机。此分析旨在为企业提供参考,助力把握技术发展机遇。
境内深度合成服务算法备案通过名单分析报告

热门文章

最新文章