PKU POJ 2531 Network Saboteur 搜索

暴力搜索也能过,剪枝去掉重复搜索,可以到1s内

View Code
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int n,c[25][25];
bool t[25];
int mmax;
void dfs(int p,int x)
{
    int i;
    if(x==0||n-p==x)
    {
        if(x>0)
            for (i=p;i<n;++i)
                t[i]=true;
        int total=0;
        for (i=0;i<n;++i)
            if(t[i])
                for (int j=0;j<n;++j)
                    if(!t[j])
                        total+=c[i][j];
        if(total>mmax)
            mmax=total;
    }
    else
    {
        t[p]=true;
        dfs(p+1,x-1);
        for (i=p;i<n;++i)
            t[i]=false;
        dfs(p+1,x);
    }
}
int main()
{
    int i,j;
    while (scanf("%d",&n)!=EOF)
    {
        for (i=0;i<n;++i)
            for (j=0;j<n;++j)
                scanf("%d",&c[i][j]);
        mmax=-1;
        for (i=1;i<=n/2;++i)
        {
            memset(t,false,sizeof(t));
            dfs(0,i);
        }
        printf("%d\n",mmax);
    }
    return 0;
}

 

posted on 2013-03-19 16:19  Deller  阅读(140)  评论(0)    收藏  举报

导航