UVA 140 - Bandwidth 暴力 全排列 回溯

本文介绍了一个通过全排列寻找给定点集之间的最大带宽最小化的算法实现。该程序读取一系列字符输入,构建节点间的连接图,并通过全排列找到使任意两点间带宽最大的排列方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8个点  全排列 一个个的判断

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 30;
int Words[maxn];
int T[maxn],RT[maxn];///A 表示 0  B 表示1
int G[maxn][maxn];

int main()
{
    #ifdef LOCAL
    freopen("in.txt","r",stdin);
    #endif // LOCAL
    char str[100];
    while(gets(str))
    {
        if(str[0] == '#')break;
        memset(Words,0,sizeof(Words));
        memset(G,0,sizeof(G));
        memset(T,-1,sizeof(T));
        for(int l = 0; l < strlen(str); l++)
        {
            int x = str[l] - 'A';
            Words[x] = 1;
            l += 2;
            while(l < strlen(str) && str[l] != ';')
            {
                int y = str[l++] - 'A';
                Words[y] = 1;
                G[x][y] = G[y][x] = 1;
            }
        }
        int N = 0;
        for(int i = 0; i < 26; i++)
            if(Words[i] == 1)T[N++] = i;
        sort(T,T+N);
        int MIN = 10;
        do
        {
            int MAX = 0;
            for(int i = 0; i < N; i++)
                for(int j = i+1; j < N; j++)
                if(G[T[i]][T[j]] == 1) MAX = (j - i) > MAX ? (j - i) : MAX; ///同种排列中取最大的带宽
            if(MIN > MAX)///两种排列中取相对较小的带宽
            {
                MIN = MAX;
                for(int i = 0; i < N; i++)
                    RT[i] = T[i];
            }
        }while(next_permutation(T,T+N));
        for(int i = 0 ; i < N; i++)
            printf("%c ", 'A' + RT[i]);
        printf("-> %d\n",MIN);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值