我在其中一次采访中发现了以下问题。请建议我这个算法。我不需要代码。
电影院中有N
个人和N
个座位数。每个人都有他喜欢的座位列表,如:
人1 - > 1,2,4
人2 - > 2,5,
人3 - > 1,3等等..
我需要找到座位可以按稳定顺序排列的方式(这意味着每个人都必须从那里的首选项列表中获得座位)。
答案 0 :(得分:2)
如果我们用图表的语言翻译您的问题,我们会得到一个bipartite graph,其中人和座位代表两个不相交的顶点集。你在寻找什么是这种图中的一些完美匹配。
我很惊讶您在采访中发现了这个问题,因为这是一个严肃的科学研究课题。有两篇论文你应该看看:
简而言之,第一篇论文提供了一种在O(c(n+m)+n^(2.5))
时间内枚举所有完美匹配的算法,而第二篇论文对其进行了改进,并给出了O(mn^(0.5)+ cn)
时间的算法,其中n
表示顶点,m
表示边数,c
表示给定二分图中完美匹配的数量。
答案 1 :(得分:0)
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Set;
public class SeatArrangement{
static int count = 0;
static Set<Integer> hs = new LinkedHashSet<Integer>();
static void getArrangementCount(LinkedList<ArrayList<Integer>> ll, int persons, int person){
ArrayList<Integer> al = ll.get(person);
Iterator<Integer> itr = al.iterator();
if(person == persons){
while(itr.hasNext()){
int value = itr.next();
if(!hs.contains(value)){
hs.add(value);
System.out.println("Entries = " + hs);
count++;
hs.remove(value);
}
}
}else{
while(itr.hasNext()){
int value = itr.next();
if(!hs.contains(value)){
hs.add(value);
getArrangementCount(ll, persons, person + 1);
hs.remove(value);
}
}
}
}
public static void main(String[] args){
int []arr1 = {1, 2, 4};
int []arr2 = {2, 5};
int []arr3 = {1, 3};
int persons = 3;
LinkedList<ArrayList<Integer>> ll = new LinkedList<ArrayList<Integer>>();
ArrayList<Integer> al1 = new ArrayList<Integer>();
for(int i = 0; i<arr1.length; i++){
al1.add(arr1[i]);
}
ArrayList<Integer> al2 = new ArrayList<Integer>();
for(int i = 0; i<arr2.length; i++){
al2.add(arr2[i]);
}
ArrayList<Integer> al3 = new ArrayList<Integer>();
for(int i = 0; i<arr3.length; i++){
al3.add(arr3[i]);
}
ll.add(al1);
ll.add(al2);
ll.add(al3);
getArrangementCount(ll, persons-1, 0);
System.out.println("Total Count = " + count);
}
}