博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-1845-Jimmy's Assignment
阅读量:5881 次
发布时间:2019-06-19

本文共 1190 字,大约阅读时间需要 3 分钟。

链接:

题意:

给一个有向图,求最大匹配。

思路:

有相图的最大匹配,可以通过加上反向边, 求这个无向图的最大匹配,

原图的最大匹配就是无向图的最大匹配除2.

详细解释:

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;const int MAXN = 5e3+10;int Next[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1}};vector
G[MAXN];int Link[MAXN], Vis[MAXN];int n, m, k;bool Dfs(int x){ for (int i = 0;i < G[x].size();i++) { int node = G[x][i]; if (Vis[node] == 0) { Vis[node] = 1; if (Link[node] == -1 || Dfs(Link[node])) { Link[node] = x; return true; } } } return false;}int Solve(){ memset(Link, -1, sizeof(Link)); int cnt = 0; for (int i = 1;i <= n;i++) { memset(Vis, 0, sizeof(Vis)); if (Dfs(i)) cnt++; } return cnt;}int main(){ int t; scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 1;i <= n;i++) G[i].clear(); int l, r; for (int i = 1;i <= 3*n/2;i++) { scanf("%d%d", &l, &r); G[l].push_back(r); G[r].push_back(l); } int cnt = Solve(); printf("%d\n", cnt/2); } return 0;}

  

转载于:https://www.cnblogs.com/YDDDD/p/10872085.html

你可能感兴趣的文章
Linux 进程中 Stop, Park, Freeze【转】
查看>>
文件缓存
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
福利丨所有AI安全的讲座里,这可能是最实用的一场
查看>>
开发完第一版前端性能监控系统后的总结(无代码)
查看>>
Python多版本情况下四种快速进入交互式命令行的操作技巧
查看>>
MySQL查询优化
查看>>
【Redis源码分析】如何在Redis中查找大key
查看>>
android app启动过程(转)
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Applet
查看>>
高并发环境下,Redisson实现redis分布式锁
查看>>
关于浏览器的cookie
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
.Net 通过MySQLDriverCS操作MySQL
查看>>
JS Cookie
查看>>
ubuntu Unable to locate package sysv-rc-conf
查看>>