uva 140 带宽暴力减枝

来源:互联网 发布:java读取nc文件源代码 编辑:程序博客网 时间:2024/04/29 12:45

这个题做的时候很头疼啊,想了好久不太好做,减枝的技巧很多,自己也不太会用,学习的其他大佬的方法,还有待提高,减枝减不好,很容易错过最优解。所以需要注意一下

也是学习了一波这个题很值得思考和考虑的题

#include <iostream>#include <cstdio>#include <cstring>#include <iomanip>using namespace std;const int maxn = 100 + 10;char s[maxn];int graph[30][30];int vis[30];int ans,number;int rgb[10];void dfs(int deep,int tmp[]){    if(deep == number)    {        int max1 = 0;        for(int i = 0; i < number; i++)        {            for(int j = i + 1; j < number; j++)            {                if(graph[tmp[i]][tmp[j]])                {                    max1 = max(max1,j - i);                }            }        }        if(ans > max1)        {            ans = max1;            for(int i = 0; i < number; i++)            {                rgb[i] = tmp[i];            }        }        return;    }    for(int i = 0; i < 26 ; i++)    {        if(vis[i])        {            int ok = 1;            for(int j = 0; j < deep; j++)//这里是进行一步判断是否要减枝,很关键的一步否则会超时            {                if(graph[i][tmp[j]])                {                    //cout<<deep - j<<"**" <<endl;                    if(deep - j > ans)                    {                        ok = 0;                        break;                    }                }            }            if(ok)            {                tmp[deep] = i;                vis[i] = 0;                dfs(deep + 1,tmp);                vis[i] = 1;            }        }    }    return;}int main(){    while(scanf("%s",s)!= EOF && s[0] != '#')    {        int i = 0;        memset(graph,0,sizeof(graph));        memset(vis,0,sizeof(vis));        while(s[i] != '\0')        {            if(s[i] == ':')            {                int ss = s[i - 1] - 'A';                vis[ss] = 1;                i++;                while(s[i] != ';' && s[i] != '\0')//这个题对于题目的输出处理也有一点难度,用一个无向图的方法去存                {                    graph[ss][s[i] - 'A'] = 1;                    graph[s[i] - 'A'][ss] = 1;                    vis[s[i] - 'A'] = 1;                    i++;                }            }            else            i++;        }        number = 0;        for(i = 0; i < 26; i++)        {            if(vis[i])                number++;        }           ans = 999999;        int tmp[10];        dfs(0,tmp);        for(int i=0; i<number; i++)            printf("%c ",rgb[i]+'A');        printf("-> %d\n",ans);    }    return 0;}


原创粉丝点击