博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2426(KM)
阅读量:5068 次
发布时间:2019-06-12

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

KM简单题,但是要注意一些东西。

1. 题目说的500*500个点的图, 按照KM的复杂度是不能过的, 但是因为这题数据不行, 所以这样也是无压力的可以过, 但是为了保险,还是用邻接表比较好

2. 题目中有一个关键的话 “he still wants to design a creative plan such that no student is assigned to a room he/she dislikes” , 意思就是不能将学生分配到他评价为负的房间,这样就代表了读数据时负边无效。

3.因为没有给出n,m的大小, 所以按照一般的KM算法可能会出现死循环, 这时要加一个判断条件, 当在进行一次匈牙利找增广路未成功时, 如果发现最小的(ui+uj-wij)(x在路径中,而y不在路径中的所有边的最小值)为INF时,就说明算法在往后进行都无法找到增广路,直接返回-1

 

Interesting Housing Problem

Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2057    Accepted Submission(s): 768

Problem Description
For any school, it is hard to find a feasible accommodation plan with every student assigned to a suitable apartment while keeping everyone happy, let alone an optimal one. Recently the president of University ABC, Peterson, is facing a similar problem. While Peterson does not like the idea of delegating the task directly to the class advisors as so many other schools are doing, he still wants to design a creative plan such that no student is assigned to a room he/she dislikes, and the overall quality of the plan should be maximized. Nevertheless, Peterson does not know how this task could be accomplished, so he asks you to solve this so-called "interesting" problem for him.
Suppose that there are N students and M rooms. Each student is asked to rate some rooms (not necessarily all M rooms) by stating how he/she likes the room. The rating can be represented as an integer, positive value meaning that the student consider the room to be of good quality, zero indicating neutral, or negative implying that the student does not like living in the room. Note that you can never assign a student to a room which he/she has not rated, as the absence of rating indicates that the student cannot live in the room for other reasons.
With limited information available, you've decided to simply find an assignment such that every student is assigned to a room he/she has rated, no two students are assigned to the same room, and the sum of rating is maximized while satisfying Peterson's requirement. The question is … what exactly is the answer?
 

 

Input
There are multiple test cases in the input file. Each test case begins with three integers, N, M, and E (1 <= N <= 500, 0 <= M <= 500, 0 <= E <= min(N * M, 50000)), followed by E lines, each line containing three numbers, S
i, R
i, V
i, (0 <= S
i < N, 0 <= R
i < M, |V
i| <= 10000), describing the rating V
i given by student S
ifor room R
i. It is guaranteed that each student will rate each room at most once.
Each case is followed by one blank line. Input ends with End-of-File.
 

 

Output
For each test case, please output one integer, the requested value, on a single line, or -1 if no solution could be found. Use the format as indicated in the sample output.
 

 

Sample Input
3 5 5 0 1 5 0 2 7 1 1 6 1 2 3 2 4 5 1 1 1 0 0 0 1 1 0
 

 

Sample Output
Case 1: 18 Case 2: 0 Case 3: -1
 

 

Source
 

 

Recommend
lcy
 

 

#include 
#include
#include
#include
using namespace std;#define N 501#define INF 0x3fffffffstruct node{ int to,next; int w;}edge[50001];int cnt,pre[N];int n,m,e;int frt[N];int wx[N],wy[N];int save[N];int markx[N],marky[N];void add_edge(int u,int v,int w){ edge[cnt].to=v; edge[cnt].w=w; edge[cnt].next=pre[u]; pre[u] = cnt++;}int dfs(int s){ markx[s]=1; for(int p=pre[s];p!=-1;p=edge[p].next) { int v=edge[p].to; if( wx[s]+wy[v]-edge[p].w < save[v]) save[v]=wx[s]+wy[v]-edge[p].w; if(marky[v]==1||wx[s]+wy[v]!=edge[p].w) continue; marky[v]=1; if(frt[v]==-1 || dfs(frt[v])==1) { frt[v]=s; return 1; } } return 0;}int KM(){ memset(frt,-1,sizeof(frt)); memset(wx,0,sizeof(wx)); memset(wy,0,sizeof(wy)); for(int i=1;i<=n;i++) for(int p=pre[i];p!=-1;p=edge[p].next) wx[i]=max(wx[i],edge[p].w); for(int i=1;i<=n;i++) { while(1) { memset(markx,0,sizeof(markx)); memset(marky,0,sizeof(marky)); for(int j=1;j<=m;j++) save[j]=INF; if( dfs(i) == 1 ) break; int mi=INF; for(int j=1;j<=m;j++) if(marky[j]==0 && save[j]
=0) { add_edge(x,y,key); } } printf("Case %d: ",tt++); if(n>m) printf("-1\n"); else printf("%d\n",KM()); } return 0;}

 

转载于:https://www.cnblogs.com/chenhuan001/archive/2013/05/07/3066002.html

你可能感兴趣的文章
bootstrap
查看>>
java编译和获取resource目录的问题
查看>>
大数据3.2 -- 实时笔记
查看>>
su: 无法设置用户ID: 资源暂时不可用
查看>>
Json 数据解析
查看>>
利用U盘安装Windows kali双系统
查看>>
Linux动态链接库的使用
查看>>
动画组
查看>>
.myhibernatedata 部分参数说明
查看>>
页面嵌入iframe关于父子传参调用
查看>>
转:iOS程序main函数之前发生了什么
查看>>
【转】互联网产品经理的职业规划:你必须知道每天应该做什么
查看>>
Xamarin Essentials教程陀螺仪Gyroscope
查看>>
AWS云主机使用流程
查看>>
深入理解java异常处理机制
查看>>
容器云平台使用体验:数人云Crane(续)
查看>>
ubuntu 安装 RPostgreSQL 库
查看>>
css 文档流中块级非替换元素水平区域的计算规则(1)
查看>>
8月15日小练
查看>>
ASP.NET MVC系列 框架搭建(三)之服务层的搭建
查看>>