【POJ 1129】Channel Allocation

【POJ 1129】Channel Allocation

暴搜做的 虽然放在了剪枝里。。。 大水题 不过好歹是训练计划第二周最后一题 做个纪念发一贴~(然而只是把上周计划完成了。。

直接上代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define INF 0x3f3f3f3f

using namespace std;

bool mp[26][26],vis[26];
int num[26],tp,mm,n;

void Set()//由于输入有点特殊 写了个输入
{
    char ch = ' ';
    int u;
    while(ch < 'A' || ch > 'Z') ch = getchar();
    u = ch-'A';
    ch = getchar();
    ch =  getchar();
    while(ch >= 'A' && ch <= 'Z')  mp[u][ch-'A'] = mp[ch-'A'][u] = 1,ch = getchar();
}

void dfs(int x)
{
    if(tp >= mm) return;//算个小剪枝?。。。
    if(x == n)
    {
        mm = min(mm,tp);
        return;
    }
    int i,f = 0;
    memset(vis,0,sizeof(vis));
    for(i = 0; i < x; ++i)//把与该点相连的点的集合标注
    {
        if(mp[i][x]) vis[num[i]] = 1;
    }
    for(i = 0; i < tp; ++i)//未标注的点均可被该点使用
    {
        if(!vis[i])
        {
            f = 1;
            num[x] = i;
            dfs(x+1);
        }
    }
    if(!f)//不存在能使用的集合 新开辟一个
    {
        num[x] = tp++;
        dfs(x+1);
    }
}

int main()
{
    int i,j;
    while(~scanf("%d",&n) && n)
    {
        memset(mp,0,sizeof(mp));
        for(i = 0; i < n; ++i) Set();

        tp = 0;
        mm = INF;

        dfs(0);
        printf("%d channel",mm);
        if(mm-1) putchar('s');
        puts(" needed.");
    }
    return 0;
}

你可能感兴趣的:(暴力暴力暴力搜)