POJ-2400 Supervisor, Supervisee 带权值匹配+枚举所有匹配情况

题意:给定两个关系矩阵,分别表示雇主和雇员的相互好感度,好感度为1最优,N最差。如果一个人与好感度为P的人匹配的话,差值为P-1,现在要求是的总共的差值最小的匹配方法,并且输出所有的匹配方案。

解法:将两两关系矩阵转化为边上的权值,然后进行一次最大匹配,最后dfs枚举输出结果,数据中给的矩阵上下颠倒了。

代码如下:

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;const int INF = 0x3f3f3f3f;int N, sum, cnt;
int mp1[20][20], mp2[20][20];
int w[20][20];
int lx[20], ly[20], sx[20], sy[20];
int match[20], slack[20];void build() {for (int i = 1; i <= N; ++i) {for (int j = 1; j <= N; ++j) {w[i][j] = -mp1[i][j]-mp2[i][j]; // 转化为最大匹配问题 
        }}
}bool path(int u) {sx[u] = 1;for (int i = 1; i <= N; ++i) {if (sy[i]) continue;int t = lx[u]+ly[i]-w[u][i];if (!t) {sy[i] = 1;if (!match[i] || path(match[i])) {match[i] = u;return true;    }} else {slack[i] = min(slack[i], t);    }}return false;
}void KM() {memset(match, 0, sizeof (match));memset(ly, 0, sizeof (ly));memset(lx, 0x80, sizeof (lx));for (int i = 1; i <= N; ++i) {for (int j = 1; j <= N; ++j) {lx[i] = max(lx[i], w[i][j]);    }}for (int i = 1; i <= N; ++i) {memset(slack, 0x3f, sizeof (slack));while (1) {memset(sx, 0, sizeof (sx));memset(sy, 0, sizeof (sy));if (path(i)) break;int d = INF;for (int j = 1; j <= N; ++j) {if (!sy[j])    d = min(d, slack[j]);}for (int j = 1; j <= N; ++j) {if (sx[j]) lx[j] -= d;if (sy[j]) ly[j] += d;else slack[j] -= d;}}}
}void dfs(int u, int tot, int deep) {if (tot < sum) return;if (deep == N) { // 匹配数量达到N printf("Best Pairing %d\n", ++cnt);for (int i = 1; i <= N; ++i) {printf("Supervisor %d with Employee %d\n", i, match[i]);    }return;}for (int i = 1; i <= N; ++i) {if (!sy[i]) {sy[i] = 1;match[u] = i;dfs(u+1, tot+w[u][i], deep+1);sy[i] = 0;}}
}void output(int ca) {double ret = 0;sum = cnt = 0;for (int i = 1; i <= N; ++i) {ret += w[match[i]][i];sum += w[match[i]][i];}ret = fabs(-ret / (2*N));printf("Data Set %d, Best average difference: %f\n", ca, ret);memset(sy, 0, sizeof (sy));dfs(1, 0, 0);
}int main() {int T, x, ca = 0;scanf("%d", &T);while (T--) {scanf("%d", &N);for (int i = 1; i <= N; ++i) {for (int j = 0; j < N; ++j) {scanf("%d", &x);mp1[x][i] = j; // 对第x个候选人的好感度排第j 
            }}for (int i = 1; i <= N; ++i) {for (int j = 0; j < N; ++j) {scanf("%d", &x);mp2[i][x] = j;}}build();KM();output(++ca);if (T) puts("");}return 0;    
}

 

转载于:https://www.cnblogs.com/Lyush/archive/2013/04/10/3013366.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黎曼猜想被证明了?“他的证明甚至不能算是个错误”!阿蒂亚爵士的证明受到同行质疑...

作者&#xff1a;许琦敏 金婉霞编辑&#xff1a;金婉霞责任编辑&#xff1a;李雪林来源&#xff1a;解剖者摘要&#xff1a;德国柏林时间9月24日上午9点45分&#xff0c;菲尔兹奖与阿贝尔奖双料得主、英国皇家学会院士迈克尔阿蒂亚爵士在德国海德堡举行的海德堡奖诺贝尔奖获得者…

Android自定义View

1.View是什么&#xff1f; View是屏幕上的一块矩形区域&#xff0c;它负责用来显示一个区域&#xff0c;并且响应这个区域内的事件。可以说&#xff0c;手机屏幕上的任意一部分看的见得地方都是View&#xff0c;它很常见&#xff0c;比如 TextView 、ImageView 、Button以及Li…

【IT笔试面试题整理】判断链表是否存在环路,并找出回路起点

【试题描述】定义一个函数&#xff0c;输入一个链表&#xff0c;判断链表是否存在环路&#xff0c;并找出回路起点 Circular linked list: A (corrupt) linked list in which a node’s next pointer points to an earlier node, so as to make a loop in the linked listEXAMP…

腾讯机器人实验室首曝光 攻坚“通用人工智能”

来源&#xff1a;新浪科技摘要&#xff1a;与当初的“互联网”一样&#xff0c;“AI”正成为各行各业的标配。在近日召开的2018 世界人工智能大会上&#xff0c;腾讯董事会主席兼首席执行官马化腾提出&#xff0c;人工智能技术是一场跨国、跨学科的科学探索工程&#xff0c;对于…

Android之canvas详解

首先说一下canvas类&#xff1a; Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e…

【水】uva10037 过桥

给出n个人所需过桥的时间&#xff0c;每次最多两人过桥&#xff0c;过桥时间为最长的人的时间。求最快所有人全部过桥方案。 贪心。先从小到大排&#xff0c;易知 n1 时 ansa[1] n2,ansmax(a[1],a[2]) n3,ansa[1]a[2]a[3] 初始化F[1、2、3],记F[n]&#xff08;n>4&#xff0…

下一代动力电池深度报告,三大技术路线谁能笑到最后?【附下载】| 智东西内参...

来源&#xff1a;智东西编辑&#xff1a;智东西内参摘要&#xff1a;随着全球电动车浪潮席卷&#xff0c;关于固态电池的新闻越来越多。从 Fisker 宣称开发充电 1 分钟行驶 500 公里的固态电池&#xff0c;到宝马已与 SolidPower 进行合作开发下一代电动车用固态电池&#xff0…

Android之shape属性详解

有时候 &#xff0c;为了满足一些需求&#xff0c;我们要用到 shape 去定义 一些背景&#xff0c;shape 的用法 跟图片一样 &#xff0c;可以给View设置 Android:background”drawable/shape”, 定义的shape 文件&#xff0c;放在 res/shape 目录下 通常我们可以用shape 做 bu…

S3C6410移植u-boot-2010.3(2)基本的启动信息修改

1、启动模块修改 进入/cpu/arm1176/目录&#xff0c;修改start.S文件 首先找到需要修改的CONFIG_NAND_SPL汇编原码&#xff0c;修改如下&#xff1a; #ifndef CONFIG_NAND_SPL /** flush v4 I/D caches*/ mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcr p1…

[修订版]”大脑“爆发背后是50年互联网架构重大变革

前言&#xff1a;面对即将到来的2019年&#xff0c;互联网诞生50年将是诸多纪念活动中重要的一个&#xff0c;经过50年的发展&#xff0c;互联网究竟发生什么重要的变化&#xff0c;通过这篇文章试图进行一次总结&#xff0c;也提前向互联网50年致敬。作者&#xff1a;刘锋 互…

Android之自定义ViewGroup

概述 在写代码之前&#xff0c;我必须得问几个问题&#xff1a; 1、ViewGroup的职责是啥&#xff1f; ViewGroup相当于一个放置View的容器&#xff0c;并且我们在写布局xml的时候&#xff0c;会告诉容器&#xff08;凡是以layout为开头的属性&#xff0c;都是为用于告诉容器…

C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用

C# 5.0 给我们带来了三个非常有用的编译器特性 CallerMemberName CallerFilePath CallerLineNumber 在C与C中由下列字符帮助我们实现调试消息的文件行号 01.#define debug_msg printf("%s[%d]:",__FILE__,__LINE__);printf 在.NET 4中与其功能相等的是 new StackTrac…

智慧城市建设:科技创业的下一个浪潮

来源&#xff1a;资本实验室随着全球城市化进程的加速&#xff0c;越来越多的人涌进城市&#xff0c;这为城市建设带来了一系列的挑战&#xff1a;一方面&#xff0c;城市需要面对大量的越来越老化的基础设施&#xff1b;另一方面&#xff0c;需要为新涌入的城市居民提供新的&a…

Android之ViewDragHelper

在自定义ViewGroup中&#xff0c;很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等)&#xff0c;针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是一件很不容易的事&#xff0c;需要自己去处理&#xff1a;多手指的处理、加速度检测等等。 好…

DARPA人工智能技术研究情况一览

来源&#xff1a;一体化指挥调度国家工程实验室、高端装备发展研究中心摘要&#xff1a;20世纪60年代初&#xff0c;DARPA&#xff08;当时为ARPA&#xff09;开始介入自主技术研究&#xff0c;并很快成为该领域的主要研究机构。DARPA意识到&#xff0c;人工智能可以满足大量的…

ListView滑动删除效果实现

通过继承ListView然后结合PopupWindow实现 首先是布局文件&#xff1a; delete_btn.xml&#xff1a;这里只需要一个Button <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/a…

直接读取硬盘扇区

Linux系统下一切都是文件&#xff0c;可以像使用普通文件一样使用设备&#xff0c;可直接操作设备扇区内容,这种方式不经过文件系统。 #include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#in…

深入“肠-脑”神经高速通道,揭开“第六感觉”面纱

来源&#xff1a;中国生物技术网直觉是什么&#xff1f;通常被描述为超感官的第六感觉&#xff0c;它在英文里直译就是肠道感觉。肠道作为“第二大脑”的事实已经家喻户晓了。如果你曾在重要的演讲前感到心慌恶心&#xff0c;或者在一顿大餐后感到头昏眼花&#xff0c;那就是肠…

移动传感器扫描覆盖

移动传感器扫描覆盖摘要&#xff1a;关于传感器网络中的地址覆盖问题&#xff0c;已经做过很多尝试。他们通常归为两类&#xff0c;全覆盖和栅栏覆盖&#xff0c;统称为静态覆盖。在这篇论文中&#xff0c;我们研究一种新的覆盖方案&#xff0c;扫描覆盖&#xff0c;一种不同于…

Andoird自定义ViewGroup实现竖向引导界面

一般进入APP都有欢迎界面&#xff0c;基本都是水平滚动的&#xff0c;今天和大家分享一个垂直滚动的例子。 先来看看效果把&#xff1a; 首先是布局文件&#xff1a; <com.example.verticallinearlayout.VerticalLinearLayout xmlns:android"http://schemas.android.…