码迷,mamicode.com
首页 > 其他好文 > 详细

BNUOJ 39423 暴力乱搞

时间:2015-08-26 15:48:54      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:暴力   dfs   

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

考虑到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;
}


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

BNUOJ 39423 暴力乱搞

标签:暴力   dfs   

原文地址:http://blog.csdn.net/u013588639/article/details/48003703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!