BNUOJ 39423 暴力乱搞

最有的答案肯定是找到一些点的集合,这些点两两之间是朋友关系。

考虑到n,m比较小,这样的集合最多只有14个点,暴力找点的集合

先找出1 个点的集合,有n个这样的集合

然后找出2个点的集合,找的时候要求编号比之前的大,这样就能保证不重不漏

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
typedef long long ll;
using namespace std;
struct node
{
    int tot;
    vector<int> p[11111];
}ji[16];
int n,m;
int Map[110][110];
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(Map,0,sizeof(Map));
        for(int i=0;i<m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            Map[x][y] = Map[y][x] = z;
        }
        for(int i=0;i<16;i++)
        {
            for(int j=0;j<10010;j++)
                ji[i].p[j].clear();
            ji[i].tot = 0;
        }
        for(int i=1;i<=n;i++)
            ji[0].p[i-1].push_back(i);
        ji[0].tot = n;
        int Max = 0;
        for(int i = 0;i<min(n,14);i++)
        {
            int len = ji[i].tot;
            for(int j = 0;j < len;j++)
            {
                int ss = ji[i].p[j].size();
                int now = ji[i].p[j][ss-1];

                for(int k = now+1;k <= n;k ++ )
                {
                    int flag = 1;
                    for(int s = 0;s < ss;s++)
                        if(Map[k][ ji[i].p[j][s] ] ==0)
                            flag = 0;
                    if(flag)
                    {
                        int Sum  = 0;
                        for(int s = 0;s<ss;s++)
                            ji[i+1].p[ji[i+1].tot].push_back( ji[i].p[j][s]);
                        ji[i+1].p[ji[i+1].tot].push_back(k);

                        int L =  ji[i+1].p[ji[i+1].tot].size();
                        for(int ii = 0;ii<L;ii++)
                        {
                            int Min = 9999999;
                            for(int jj=0;jj<L;jj++)
                                if(ii!=jj)
                                Min = min(Min,Map[ji[i+1].p[ji[i+1].tot][ii]][ji[i+1].p[ji[i+1].tot][jj]]);
                            Sum +=Min;
                        }
                        Max = max(Max,Sum);
                        ji[i+1].tot++;
                    }

                }
            }
        }
//        for(int i=0;i<3;i++)
//            cout<<ji[i].tot<<endl;
        printf("%d\n",Max);
    }
    return 0;
}

DFS写法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
typedef long long ll;
using namespace std;
int Map[111][110];
int s[111];
int cur ;
int n,m;
int Max=  0;
int dfs(int st,int cur)
{
    if(cur>=2)
    {
        int sum = 0;
        for(int i=1;i<=cur;i++)
        {
            int Min  = 99999999;
            for(int j=1;j<=cur;j++)
            if(i!=j)
                Min =  min(Min,Map[s[i]][s[j]]);
            sum+=Min;
        }
        Max = max(sum,Max);
    }
    for(int i = st+1;i <= n;i++)
    {
        int ok = 1;
        for(int j = 1;j<=cur;j++)
        {
            if(Map[i][s[j]]==0)
                ok = 0;
        }
        if(ok)
        {
            s[cur+1] = i;
            dfs(i,cur+1);
        }
    }
    return 0;
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=0;i<m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            Map[x][y]  = Map[y][x] = z;
        }
        Max = 0;
        dfs(0,0);
        printf("%d\n",Max);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-04 17:29:56

BNUOJ 39423 暴力乱搞的相关文章

topcoder-srm610-div2-550(暴力乱搞)

给你一个01矩阵,求其中最大的01交替的矩阵 由于n最大才100,所以直接暴力乱搞 先求出第i行,所有列往上的合法长度,然后枚举以第j列为最左边的列,计算可以得到的最大矩阵 /************************************************************************* > File Name: 2.cpp > Author: ALex > Mail: [email protected] > Created Time: 2015年

Codeforces Gym 100203G Good elements 暴力乱搞

原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 考虑暴力的复杂度是O(n^3),所以我们需要记录所有的ai+aj,如果当前考虑到了ak,那么就去前面寻找ai,使得ak-ai是我们记录过的和.整个算法的复杂度O(n^2). 代码 #include<iostream> #include<cstring> #include<cstdio> #include<

codeforces 498D Unbearable Controversy of Being (暴力乱搞)

传送门:点击打开链接 题目大意: 定义下图为"damn rhombus",给定一个有向图,求出有多少个"damn rhombus". 解题思路1: 分析可以得出其实"damn rhombus"的意思就是求a->c通过2个节点中转的个数.也就是说 如果a->c中间中转了x个点,那么对于点对(a,c)来说"damn rhombus"就有C(x,2)个. 那么通过层数为2的bfs就可以得出答案. #include <

POJ 3077-Rounders(水题乱搞)

Rounders Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7697   Accepted: 4984 Description For a given number, if greater than ten, round it to the nearest ten, then (if that result is greater than 100) take the result and round it to th

【bzoj2241】[SDOI2011]打地鼠  暴力+乱搞

2241: [SDOI2011]打地鼠 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1069 Solved: 679 [Submit][Status][Discuss] Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中.玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高. 游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打

Ural 1780 Gray Code 乱搞暴力

原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1780 1780. Gray Code Time limit: 0.5 secondMemory limit: 64 MB Denis, Vanya and Fedya gathered at their first team training. Fedya told them that he knew the algorithm for constructing aGray code. Cre

CodeForces - 1228D (暴力+思维+乱搞)

题意 https://vjudge.net/problem/CodeForces-1228D 有一个n个顶点m条边的无向图,在一对顶点中最多有一条边. 设v1,v2是两个不相交的非空子集,当满足以下条件时f(v1,v2)为真 v1中的点之间不存在边 v2中的点之间不存在边 对于在v1v2中的每一对顶点,x在v1中,y在v2中,xy之间有边 所有点集不为空,且不相交,是否有v1,v2,v3使得f(v1,v2).f(v2,v3).f(v3,v1)均为真 如果有输出每个点所在的点集(1,2,3),否则

学渣乱搞系列之扩展KMP的那点事

扩展KMP牵涉了一些相对运动的姿势,比较费解!本学渣看了一天的扩展KMP,打算写点东西...本文看后,出现的后果本人一概不负责.毕竟我不是很会表达. 扩展KMP是搞什么灰机的?本学渣所知道的扩展KMP是来解集训篇那道字符串题的.有了犯罪动机,现在就要下手.不要以为扩展KMP就以为与KMP关系暧昧.屁大点事,两个根本不是一个东西.只是有点思想是一致的,就是利用已经匹配的信息避免一些不必要的匹配. 以此提高匹配速度.不过扩展KMP也能干KMP干的事.但是速度没KMP那么快. 扩展KMP要造两个数组,

CodeForces 398A Cards 贪心 暴力 瞎搞

搞了一晚上了快,各种YY乱搞啊,终于过了,一开始YY的都是错的,觉得 这道题目a,b的范围都是10^5,那就暴力枚举b被分成了几份,然后再继续YY,只用一个o去分隔x,这样最后剩下的o再集中在一起,也就是x的份数总是比o的份数多一份,也就是尽可能把x分开,尽可能把o集中在一块,前面都把x分开了,一个o分开两份x,后面还能有一大堆的o在一起,这样就满足了,然后又出错了,因为分成几份,有余数的,比如b = 6,你要分成4份,我以开始是分成 1  1  1  3这样子,这样不行,应该分成 1 1 2