Luogu P1692 部落卫队

解题思路

数据范围不是很大,那应该不是那些普遍的图论的算法。考虑搜索,用暴力解决。从1到N枚举每一个点的位置,搜索这个点事选还是不选。如果在这个点之前选到的点中又和他冲突的点,那就不选,要么就选。

附上代码

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int n, m, cnt[103], Ans[103], ans[103], res;
bool dis[103][103], mark;

inline void DFS(int x, int tot) {
    if(x == n+1) {
        if(res < tot) {
            res = tot;
            for(int i=1; i<=n; i++)
                Ans[i] = ans[i];
        }
        return ;
    }
    if(tot + (n-x+1) <= res) return ;
    mark = false;
    for(int i=1; i<=x-1; i++) {
        if(ans[i] && (dis[x][i] || dis[i][x])) {
            mark = true;
            break;
        }
    }
    if(!mark) {
        ans[x] = 1;
        DFS(x+1, tot+1);
        ans[x] = 0;
    }
    DFS(x+1, tot);
}

int main() {
    scanf("%d%d", &n, &m);
    int x, y;
    for(int i=1; i<=m; i++) {
        cin>>x>>y;
        dis[x][y] = 1;
        dis[y][x] = 1;
    }
    DFS(1, 0);
    printf("%d\n", res);
    for(int i=1; i<=n; i++) printf("%d ", Ans[i]);
}

原文地址:https://www.cnblogs.com/bljfy/p/9463825.html

时间: 2024-10-30 03:53:21

Luogu P1692 部落卫队的相关文章

【luogu P3950 部落冲突】 题解

题目连接:https://www.luogu.org/problemnew/show/P3950 1.像我这种学数据结构学傻了的 2.边权化点权 所有点权初始化0 3.对于战争 将深度较深的-1,对于和平 将深度较深的+1 4.对于历史 用war记录 5.特别注意 在两个查询的LCA处判断是否为-1并且当前的整条路径上的点权也为-1时 同样是yes 代码: include include include include define lson left, mid, rt<<1 define r

tyvj 1593

背景 传说中,有这样一个部落....... 描述 原始部落byteland中的居民们为了争夺有限的资源,经常发生冲突,几乎每个居民都有仇敌.村落酋长为了组织一支保卫部落的队伍,希望从部落的居民中选出至多的居民入伍,并保证队伍中的任何2个人都不是仇敌. 给定byteland部落中居民之间的仇敌关系,编程计算组成部落卫队的最佳方案. 格式 输入格式 第一行有2个正整数n和m,表示byteland部落中有n个居民,居民间有m个仇敌关系.接下来的m行中,每行有2个正整数u和v,表示居民u与居民v是仇敌.

[复习]深度优先搜索

深度优先搜索(dfs)是利用递归完成的以搜索深度优先的搜索 通常大概是这样的: 1 void search(int vi){ 2 if( 达到目标 ){ //边界 3 if( 不满足要求 ) return ; 4 //(和最优解比较) 5 //当比当前最优解更优时 6 //更新当前最优解 7 return ;//必须返回 8 } 9 for( int i = ...; i <= ... ; i++ ){ //枚举 10 //保存结果 11 search(vi); 12 //清除刚刚保存的结果 1

[Luogu] 部落冲突--00

https://www.luogu.org/problemnew/show/P3950 思路简单,树剖不用动脑子 #include <bits/stdc++.h> using namespace std; const int N = 3e5 + 10; #define gc getchar() #define lson jd << 1 #define rson jd << 1 | 1 struct Node_1{ int v, nxt; }G[N << 1]

【Luogu P3950】部落冲突

Problem Description 给出一棵树. 你需要处理下面三件事,所有的事件都是按照时间顺序给出的. \(Q, u, v\) 代表询问 \(u, v\) 之间能否相互到达 \(C, u, v\) 代表 \(u, v\) 之间的边断开了 \(U, x\) 代表第 \(U\) 次 \(C\) 操作被还原 Input Format 第一行两个数 \(n\) 和 \(m\) , \(n\) 代表了一共有 \(n\) 个部落,\(m\) 代表了以上三种事件发生的总数 接下来的 \(n - 1\)

luogu P2467 [SDOI2010]地精部落

很有意思的dp计数题目. 思考一下发现开始时山峰和开始是山谷的方案数是相同的 所以我们只需要统计一个即可. 证明的话可以考虑对于任意一种开始时山峰的方案 每个数字变成n-a[i]+1 那么可以此方案还是一个排列 且变成开始时山谷的方案. 考虑统计一个 设f[i][j]表示到了第i个数字 此时放数集合为j的方案数. n*2^n的复杂度当然过不了.之所以有这么高的复杂度 是因为数的集合一直放不下去. 只要我们考虑出和数的大小无关的状态就能降低复杂度. 强行考虑 f[i]表示i个数字所形成的第一个为山

luogu 4047 [JSOI2010]部落划分 最小生成树

最小生成树或者二分都行,但是最小生成树会好写一些~ Code: #include <bits/stdc++.h> #define ll long long #define N 1000005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; ll x[N],y[N]; int p[N]; struct Edge { int u,v; ll c; }e[N]; bool cmp(

P4047 [JSOI2010]部落划分

P4047 [JSOI2010]部落划分 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落之间则经常发生争斗.只是,这一切都成为谜团了--聪聪根本就不知道部落究竟是如何分布的. 不过好消息是,聪聪得到了一份荒岛的地图.地图上标注了N个野人居住的地点(可以看作是平面上的坐标).我们知道,同一个部落的野人总是生活在附近.我们把两个部落的距离,定义为部落中距离最近的那两个居住点的距离.聪聪还获得了一个

luogu P3799 妖梦拼木棒

二次联通门 : luogu P3799 妖梦拼木棒 /* luogu P3799 妖梦拼木棒 用一个桶存下所有的木棒 美剧两根短的木棒长度 后随便乘一乘就 好了.. */ #include <algorithm> #include <cstdio> #define Mod 1000000007 #define Max 5000 void read (int &now) { now = 0; register char word = getchar (); while (wo