可以安排多少种座位方式

时间:2018-03-08 07:38:38

标签: algorithm math data-structures combinations permutation

我在其中一次采访中发现了以下问题。请建议我这个算法。我不需要代码。

电影院中有N个人和N个座位数。每个人都有他喜欢的座位列表,如:

人1 - > 1,2,4

人2 - > 2,5,

人3 - > 1,3等等..

我需要找到座位可以按稳定顺序排列的方式(这意味着每个人都必须从那里的首选项列表中获得座位)。

2 个答案:

答案 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);

        }
    }