POJ 2531 Network Saboteur

DFS or 随机化

dfs: 138K 1738MS

View Code
#include <stdio.h>
#include <string.h>
const int MAXN = 25;
int best = 0;
int map[MAXN][MAXN], n;
bool join[MAXN];
void dfs(int t, int num)
{
    int i, j ;
    if(num == 0)
    {
        int sum = 0;
        for(i=1; i<=n; i++)
            for(j=i+1; j<=n; j++)
                if(join[i] != join[j])
                    sum += map[i][j];
        if( sum > best )
            best = sum ;
        return ;
    }
    else
    {
        for(i=t; i<=n; i++)
        {
            join[t] = true;
            dfs(i+1, num-1);
            join[t] = false;
            if( n-t < num )
                return ;
        }
    }

}
int main()
{
    int i, j;
    scanf("%d", &n);
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            scanf("%d", &map[i][j]);
    for(i=1; i<=n/2+1; i++)  //枚举集合A的元素个数i,则集合B有n-i元素
    {
        memset(join, 0 ,sizeof(join));
        dfs(1, i) ;
    }
    printf("%d\n", best);
    return 0;
}

随机算法:我也不清楚cnt 究竟设多大才好 觉得这种算法只能在n很小的时候弄 有投机取巧之嫌。。

168K  282MS

View Code
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>

const int MAXN = 25;
int best = 0, sum;
int map[MAXN][MAXN], n;
bool join[MAXN];
void change(int x)
{
    for(int i=1; i<=n; i++)
        if( join[i] != join[x] )
            sum += map[i][x];
        else
            sum -= map[i][x];
}
int main()
{
    int i, j;
    scanf("%d", &n);
    for(i=1; i<=n; i++)
        for(j=1; j<=n; j++)
            scanf("%d", &map[i][j]);
    memset(join, 0, sizeof(join));
    int cnt = 200000;
    while( cnt -- )
    {
        int x = rand()%n + 1;
        join[x] = !join[x];
        change(x);
        if( sum > best )
            best = sum;
    }
    printf("%d\n", best);
    return 0;
}

 

posted @ 2013-03-07 11:17  April_Tsui  阅读(196)  评论(0编辑  收藏  举报