美文网首页
回溯法解部落冲突问题

回溯法解部落冲突问题

作者: theo_NI | 来源:发表于2017-12-27 22:36 被阅读0次

部落冲突问题:原始部落byteland中的居民们为了争抢有限的资源,经常发生冲突。几乎每个居民都有它的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何两个人都不是仇敌。

算法设计:给定byteland部落中居民间的仇敌关系,计算组成部落卫队的最佳方案。

数据输入:首先输入两个正整数n个m,表示byteland部落中有n个居民,居民间有m个仇敌关系。居民编号为1,2,…,n。接下来输入m对正整数,每对正整数包含u和v,表示居民u和居民v是仇敌。

结果输出:首先输出部落卫队最佳组建方案中包含的居民人数。之后逐个输出卫队组成xi, 1<=xi<=n, xi=0表示居民i不在卫队中,xi=1表示居民i在卫队中。

package 部落冲突;

public class Backtrack
{
    static int[] x;//当前子集
    static int n;//二叉树层数,即部落总人数
    static int cn;//当前队伍人数
    static int bestn;//最大队伍人数
    static int[] bestx;//最优解
    static int[][] a;//表示队伍人员关系的邻接矩阵
    /**回溯法解最大团算法(部落冲突问题)
     * @param i   当前层数
     */
    public static void backTrack(int i){
        if(i>n){
            for(int b=1;b<=n;b++){
                bestx[b]=x[b];
                
                
            }
            bestn=cn;
            return;
        }
        boolean ok=true;//临界条件:与任一已入选护卫队的队员无仇
        for(int j=1;j<i;j++){
            if(x[j]==1&&a[i][j]==1){
                ok=false;
                break;
            }
        }
        if(ok){
            x[i]=1;
            cn++;
            backTrack(i+1);
            cn--;
        }
        if((cn+(n-i))>bestn){
            x[i]=0;
            backTrack(i+1);
        }
    }
    public static void main(String[] args)
    {
        int[] c1={10,1,2,3,4,5,6,7,8,8,9};//初始化仇人
        int[] c2={1,5,3,5,6,8,7,8,9,10,10};//同上
        n=10;
        cn=0;
        bestn=0;
        bestx=new int[n+1];
        x=new int[n+1];
        a=new int[n+1][n+1];
        for(int h1=1;h1<a.length;h1++){
            a[0][h1]=h1;
            a[h1][0]=h1;
        }
        for(int h1=0;h1<c1.length;h1++){//构建邻接矩阵
            a[c1[h1]][c2[h1]]=1;
            a[c2[h1]][c1[h1]]=1;
        }

        System.out.println("敌对关系:");
        for(int h1=0;h1<c1.length;h1++){
            System.out.print(c1[h1]+" vs "+c2[h1]);
            System.out.println();
        }
        backTrack(1);
        System.out.println("队伍最大人数达: "+bestn);
        System.out.print("分别是:");
        for(int h4=1;h4<bestx.length;h4++){
            if(bestx[h4]==1){
                System.out.print(h4+" ");
            }
        }
    }
    

}

相关文章

  • 回溯法解部落冲突问题

    部落冲突问题:原始部落byteland中的居民们为了争抢有限的资源,经常发生冲突。几乎每个居民都有它的仇敌。部落酋...

  • 回溯法之N皇后问题

    回溯法 有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。 回溯法的...

  • 五大基本算法——分支限界法

    一、基本思路 与回溯法一样,分支限界法也是在问题的解空间树上搜索问题的解的一种算法。 二、分支限界法与回溯法的区别...

  • 算法的设计思想2

    4,回溯法 回溯法是一种优化的穷举法。所谓穷举法就是穷举问题的所有可能性,直到发现解决问题的最佳解为止。回溯法会有...

  • 常见算法思想6:回溯法

    回溯法 回溯法也叫试探法,试探的处事方式比较委婉,它先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐...

  • LeetCode之N-Queens(Kotlin)

    问题: 方法:DFS加回溯法,搜索算法是DFS暴力强解,过程中需要用回溯法重置棋盘。 具体实现: 有问题随时沟通 ...

  • 软件设计师考试 | 第八章 算法设计与分析 | 分支限界法

    分支限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。 一般情况下,分支限界法与回溯法的求解目标不同...

  • 优先队列分支限界法解部落冲突问题

    算法思路: 构建解空间树(二叉树) 以广度优先遍历解空间树,对每个结点进行约束函数和限界函数判断 约束函数:若要入...

  • 37. Sudoku Solver

    key tips 回溯法 notes 对于回溯法解决的问题,如果可行解只有一个,则可以在最后一层递归中,返回tru...

  • 回溯算法

    回溯法 回溯法的算法框架 1. 综述 从问题的 解空间树 中,按照 深度优先 的策略,从根节点出发搜索解空间树。 ...

网友评论

      本文标题:回溯法解部落冲突问题

      本文链接:https://www.haomeiwen.com/subject/ucvpgxtx.html