题目大意:给出一个n个点的有向带权图,找若干个圈,使得每个节点恰好属于一个圈,要求总长度尽量小

解题思路:首先要在一个圈内,且只能在一个圈内,那么每个点的入度和出度要都为1,所以二分图就有了
接着连边,给出来的边都连了,没给的边就设为INF,最后求最小权和就可以来
如果最小权和大于INF了,就表示无法满足每个点都在一个圈内的要求了
注意:会有重边

#include <cstdio>
#include <cstring>#define N 110
#define INF 0x3f3f3f3f
#define max(a,b)((a)>(b)?(a):(b))
#define min(a,b)((a)<(b)?(a):(b))
#define abs(a)((a)>0?(a):(-(a)))
#define ll long longint w[N][N], Lx[N], Ly[N], left[N], slack[N];
bool S[N], T[N];
int n, m;void init() {memset(w, 0x3f, sizeof(w));int j, d;for (int i = 1; i <= n; i++) {while(scanf("%d", &j) && j) {scanf("%d", &d);w[i][j] = min(w[i][j], d);}}for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)w[i][j] = -w[i][j];
}bool match(int i) {S[i] = true;for (int j = 1; j <= n; j++) {if (Lx[i] + Ly[j] == w[i][j] && !T[j]) {T[j] = true;if (!left[j] || match(left[j])) {left[j] = i;return true;}}else slack[j] = min(slack[j], Lx[i] + Ly[j] - w[i][j]);}return false;
}int KM() {for (int i = 1; i <= n; i++) {left[i] = Ly[i] = 0;Lx[i] = -INF;for (int j = 1; j <= n; j++)Lx[i] = max(Lx[i], w[i][j]);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++)slack[j] = INF;while (1) {for (int j = 1; j <= n; j++) S[j] = T[j] = 0;if (match(i)) break;int a = INF;for (int j = 1; j <= n; j++)if (!T[j])a = min(a, slack[j]);for (int j = 1; j <= n; j++) {if (S[j]) Lx[j] -= a;if (T[j]) Ly[j] += a;}}}ll ans = 0;for (int i = 1; i <= n; i++)ans += Lx[i] + Ly[i];return ans;
}void solve() {ll ans = KM();if (abs(ans) >= INF)printf("N\n");elseprintf("%lld\n", abs(ans));
}int main() {while (scanf("%d", &n) != EOF && n) {init();solve();}return 0;
}

UVALive - 3353 Optimal Bus Route Design(二分图最佳匹配)相关推荐

  1. UVALive 3353 Optimal Bus Route Design

    UVALive 3353 Optimal Bus Route Design 二分图最大完美匹配 题目 题目给出一个带权有向图,找若干个圈,使得每个结点切好属于一个圈,并且所有圈的总长度最小,如果没有满 ...

  2. UVALive 3353 - Optimal Bus Route Design(二分图最小权匹配)

    题目链接 https://cn.vjudge.net/problem/UVALive-3353 [题意] 给你n个点(n<=100)的有向带权图,你要找到n个有向环,使得每个点恰好属于一个环,要 ...

  3. 【UVALive】 3353 Optimal Bus Route Design 费用流

    传送门:[UVALive]3353 Optimal Bus Route Design 题目大意:给出一个n(n <= 100)个点的有向带权图,找若干个圈,使得每个结点恰好属于一个圈.要求总长度 ...

  4. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

  5. Uvalive3353 Optimal Bus Route Design 带权二分图匹配

    题目描述:给出一个有向带权图,现在要求在图中找出若干个环,使得每个点恰好在一个环里,且所有环的距离之和最小,如果不能使每个点恰好在一个环里,输出"N". 思路: 将每个点u拆成u和 ...

  6. POJ 2195 【二分图最佳匹配】.cpp

    题意: 有 n 个房子和 n 个人 每个人走一个单元你就要付 1$ 有什么办法可以让把所有人都分派到房子里 而花费最少 输入: 给出n m 表示该矩阵由n 行 m 列组成 然后给出一个n*m的图 . ...

  7. HDU - 奔小康赚大钱(二分图最佳匹配+KM)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  8. POJ365Ants_二分图最佳匹配

    https://blog.csdn.net/lianai911/article/details/44835659 题意: 在坐标系中有N只蚂蚁,N棵苹果树,给你蚂蚁和苹果树的坐标.让每只蚂蚁去一棵苹果 ...

  9. UVA-1045 - The Great Wall Game(二分图最佳匹配)

    题意:在一个n*n的棋盘上有n个棋子,要求通过移动棋子使棋子的排布满足以下情况之一:呈横行排列:呈纵行排列:呈对角线排列(有两条). 棋子移动一个单元格的费用为1,总费用为所有棋子的移动费用之和.求最 ...

最新文章

  1. python3 模式匹配查找文件路径 glob模块 简介
  2. 用python的turtle画圆-(python海龟绘图怎么增加每次画圆的半径)
  3. Spring Cloud 爆高危漏洞!!!
  4. BZOJ2301[HAOI2011] Problem b
  5. 用 Python 绘制了若干张词云图,惊艳了所有人
  6. Charles使用详解(For macOS)
  7. vba 位 前 相似 筛选_Excel VBA复制筛选的当前区域可见单元格,但排除最后3列
  8. java 支持 超大上G , 多附件上传
  9. 数据结构:八大数据结构分类
  10. 运用集合实现用户的注册和登录
  11. 根据android版本号,增加兼容性处理
  12. 权重股启动意味着什么
  13. W3Cschool从零开始学C语言笔记(1-2)位、字节及排列组合
  14. Python求两个或三个正整数的最大公约数和最小公倍数
  15. 基因数据处理98之SparkBWA运行时spark on Yarn问题日志完整记录
  16. 数据库(Mysql)学习
  17. java程序员必读书目推荐
  18. 旁瓣对消原理_自适应旁瓣相消的原理
  19. MybatisX插件的使用
  20. Python PEP8 — the Style Guide for Python Code

热门文章

  1. 怎样用python实现微信盯盘
  2. 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。...
  3. 谷歌地图如何制定火车路线_如何制定完美的路线图?
  4. 电子元件又一话---------电容篇
  5. 江波龙深化存储技术优势 紧密结合物联网应用需求创新
  6. SRS支持的各种HTTP直播流(FLV、TS、MP3、AAC)
  7. stm32f407定时器输出pwm波形
  8. 计算机毕设 SSM+Vue个人健康管理系统 个人健康档案系统 个人健康信息管理系统Java Vue MySQL数据库 远程调试 代码讲解
  9. null在matlab中什么意思,null表示什么
  10. [创建型设计模式:Builder]代码实现