zoukankan      html  css  js  c++  java
  • 部落卫队 (回溯搜索)

    部落卫队
    【问题描述】
           原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突。几乎每个居民都有他的仇敌。部落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出最多的居民入伍,并保证队伍中任何2 个人都不是仇敌。
    【编程任务】
            给定byteland部落中居民间的仇敌关系,编程计算组成部落卫队的最佳方案。
    【输入格式】
    第1行有2个正整数n和m,表示byteland部落中有n个居民,居民间有m个仇敌关系。居民编号为1,2,…,n。接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌。
    【输出格式】
    第1行是部落卫队的顶人数;文件的第2行是卫队组成x i,1≤i≤n,xi =0 表示居民i不在卫队中,xi=1表示居民i在卫队中。
    【输入样例】
    7  10
    1  2
    1  4
    2  4
    2  3
    2  5
    2  6
    3  5
    3  6
    4  5
    5  6
    【输出样例】
    3
    1 0 1 0 0 0 1
    代码如下:
    /*搜索出所有的情况,找出最大的。能否搜索的条件是,没有加入队伍并且队伍中的人没有他的仇敌*/
    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int search(int);
    int maxx=0,sum;
    int cd[20][20];
    bool b[20],g[20];
    int pd(int);
    int n,c,x,y;
    int main() {
    
        scanf("%d%d",&n,&c);//输入
        for(int i=1; i<=c; i++) {
            scanf("%d%d",&x,&y);
            cd[x][y]=cd[y][x]=1;//互相是敌人标记1
        }
        search(1);//加入第一个人
        cout<<maxx<<endl;
        for(int i=1; i<=n; i++)
            cout<<g[i]<<" ";//输出是否加入
        cout<<endl;
        return 0;
    }
    int search(int x) {
        for(int i=1; i<=n; i++) {
            if(!b[i]) { //没有加入
                if(pd(i)) {    //判断已经加入的人中是否有他的仇敌
                    b[i]=1;    //加入队伍,加入的人数加1
                    sum++;
                }
                if(x==n) { //全都加完
                    if(sum>maxx)
                        maxx=sum;//找最大值
                    for(int i=1; i<=n; i++)
                        g[i]=b[i];//记录答案
                } else {
                    search(x+1);//找下一个
                    b[i]=0;//回溯(回溯注意在else里)
                    sum--;
                }
    
            }
        }
    }
    int pd(int x) {
        for(int i=1; i<=n; i++) {
            if(b[i]&&cd[x][i])//判断与已经加入的人是否是仇敌
                return 0;
        }
        return 1;
    }
  • 相关阅读:
    /etc/sysctl.conf 控制内核相关配置文件
    python 并发编程 非阻塞IO模型
    python 并发编程 多路复用IO模型
    python 并发编程 异步IO模型
    python 并发编程 阻塞IO模型
    python 并发编程 基于gevent模块 协程池 实现并发的套接字通信
    python 并发编程 基于gevent模块实现并发的套接字通信
    python 并发编程 io模型 目录
    python 并发编程 socket 服务端 客户端 阻塞io行为
    python 并发编程 IO模型介绍
  • 原文地址:https://www.cnblogs.com/zzyh/p/6610055.html
Copyright © 2011-2022 走看看