poj 3020 Antenna Placement(二分图的最大匹配)
题目:http://poj.org/problem?id=3020
这个题主要是构图比较难,处理方法是把城市编号然后如果在上下左右四个方向存在城市的话,那么这两个城市就可以组成一条边,构成的图是一个无向图,
DAG图的最小路径覆盖 = 节点数(n)- 最大匹配数;
无向图的最小路径覆盖=节点数(n)-最大匹配数/2;
代码:

1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int map[405][405]; 6 int st[45][15]; 7 int vis[405]; 8 int link[405]; 9 int num; 10 int n,m; 11 int dire[4][2]={{0,1},{1,0},{-1,0},{0,-1}}; 12 int find(int x) 13 { 14 int i; 15 for(i=1;i<=num;i++) 16 { 17 if(!vis[i]&&map[x][i]) 18 { 19 vis[i]=1; 20 if(link[i]==0||find(link[i])) 21 { 22 link[i]=x; 23 return 1; 24 } 25 } 26 } 27 return 0; 28 } 29 int main() 30 { 31 int t,i,j,k,su; 32 char c; 33 scanf("%d",&t); 34 while(t--) 35 { 36 memset(st,0,sizeof(st)); 37 memset(map,0,sizeof(map)); 38 memset(link,0,sizeof(link)); 39 scanf("%d%d",&n,&m); 40 num=0; 41 getchar(); 42 for(i=1;i<=n;i++) 43 { 44 for(j=1;j<=m;j++) 45 { 46 scanf("%c",&c); 47 if(c=='*') 48 { 49 num++; 50 st[i][j]=num; 51 } 52 } 53 getchar(); 54 } 55 for(i=1;i<=n;i++) 56 { 57 for(j=1;j<=m;j++) 58 { 59 if(st[i][j]!=0) 60 { 61 for(k=0;k<4;k++) 62 { 63 if(st[i+dire[k][0]][j+dire[k][1]]!=0) 64 { 65 map[st[i][j]][st[i+dire[k][0]][j+dire[k][1]]]=1; 66 } 67 } 68 } 69 } 70 } 71 su=0; 72 for(i=1;i<=num;i++) 73 { 74 memset(vis,0,sizeof(vis)); 75 if(find(i)) 76 su++; 77 } 78 printf("%d\n",num-(su/2)); 79 } 80 return 0; 81 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具