国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Uva140 Bandwidth 【dfs回溯+剪枝】【例題7-6】

2019-11-11 06:53:43
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

題目:Bandwidth

題意:給出一個(gè)n(n≤8)個(gè)結(jié)點(diǎn)的圖G和一個(gè)結(jié)點(diǎn)的排列,定義結(jié)點(diǎn)i的帶寬b(i)為i和相鄰結(jié)點(diǎn)在排列中的最遠(yuǎn)距離,而所有b(i)的最大值就是整個(gè)圖的帶寬。 給定圖G,求出讓帶寬最小的結(jié)點(diǎn)排列。

思路:

(1)處理輸入:將給出的字符串用二維數(shù)組表示成圖

(2)標(biāo)準(zhǔn)的回溯dfs,將給出的結(jié)點(diǎn)進(jìn)行全排列,篩選最小帶寬。

(3)剪枝:在進(jìn)行排列時(shí),當(dāng)前的結(jié)點(diǎn)如果與之前的結(jié)點(diǎn)的距離大于當(dāng)前的最優(yōu)值,則無(wú)需再遞歸排列,因?yàn)榇诵蛄幸呀?jīng)不可能為最優(yōu)解了。剪掉。

參考:入門(mén)經(jīng)典-例題7-6-P197

代碼:

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;char str[100];int g[30][30],visit[30],ans,number;int PRt[10];void dfs(int steps, int seq[]){    if(steps == number){//滿(mǎn)足個(gè)數(shù)        int maxv = 0;        for(int i=0;i<number;i++)//進(jìn)行尋找本次排列的帶寬            for(int j=i+1;j<number;j++)                if(g[seq[i]][seq[j]]) maxv = max(maxv,j-i);        if(ans > maxv){//保留最大值            ans = maxv;            for(int i=0;i<number;i++) prt[i] = seq[i];//保存序列        }        return;    }    for(int i=0;i<26;i++){        if(visit[i]){            int ok = 1;            for(int j=0;j<steps;j++)//判斷當(dāng)前結(jié)點(diǎn)與之前的結(jié)點(diǎn)距離,如果大于當(dāng)前最優(yōu)值,就無(wú)需再遞歸排列了,剪枝                if(g[i][seq[j]])//存在邊                    if(steps-j > ans){ok = 0;break;}//如果大于最優(yōu)解即跳出            if(ok){                seq[steps] = i;                visit[i] = 0;                dfs(steps+1,seq);                visit[i] = 1;            }        }    }return ;}int main(){    while(scanf("%s",str)!=EOF && str[0] != '#'){        int i=0;        memset(g,0,sizeof(g));        memset(visit,0,sizeof(visit));        while(str[i]!='/0'){//處理輸入,用二維數(shù)組g表示出來(lái)圖            if(str[i] == ':'){                int s = str[i-1] - 'A';                visit[s] = 1;                i++;                while(str[i] != ';' && str[i] != '/0'){                    g[s][str[i] - 'A'] = 1;                    g[str[i] - 'A'][s] = 1;                    visit[str[i] - 'A'] = 1;                    i++;                }            }            else i++;        }        number = 0;        for(int i=0;i<26;i++) if(visit[i]) number++;//計(jì)算結(jié)點(diǎn)個(gè)數(shù)        ans = 99999999;        int temp[10];        dfs(0,temp);        for(int i=0;i<number;i++) printf("%c ",prt[i]+'A');        printf("-> %d/n",ans);    }return 0;}


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄陵县| 美姑县| 胶南市| 洪雅县| 思茅市| 巧家县| 成武县| 邵武市| 安新县| 玛纳斯县| 涟水县| 阳信县| 江华| 大冶市| 盘锦市| 曲松县| 安达市| 义马市| 额敏县| 维西| 涿鹿县| 女性| 南华县| 改则县| 洱源县| 叙永县| 年辖:市辖区| 正安县| 永城市| 锡林浩特市| 太原市| 工布江达县| 新密市| 四川省| 乌兰察布市| 南江县| 宜都市| 遂川县| 平邑县| 连城县| 磐安县|