遞迴回溯 UVa140 Bandwidth寬頻

2022-08-28 02:06:13 字數 2929 閱讀 4844

本題題意:尋找乙個排列,在此排序中,頻寬的長度最小(頻寬是指:任意一點v與其距離最遠的且與v有邊相連的頂點與v的距離的最大值),若有多個,按照字典序輸出最小的哪乙個。

解題思路:

方法一:由於題目說結點的個數最多是8個,所以,最先想到的方法是暴力列舉,將所有的結點全排列,然後找到寬頻長度最小的那乙個,此方法不會超時。

方法二:利用回溯法,將所有肯能的情況都遍歷一遍,儲存目前最短的寬頻的長度minn,若當前的寬頻長度大於minn,就進行剪枝,此題要注意,此題的結點不一定是從a開始的,所以要建立字母的對映,儲存結點,同是注意輸入時空格的處理。

暴力列舉的**:

1 #include2 #include3 #include

4 #include5 #include6

using

namespace

std;

7char str[100];8

int a[30][30],b[10],c[10][10],visit[10];9

intmain()

24int t=str[i++]-'

a'+1;25

while(str[i]=='

')26 i++;

27while(i

32if(str[i]==';'

)36int k=str[i++]-'

a'+1

;37 a[t][k]=1

;38 a[k][t]=1;39

}40}41

}42int num=0;43

for(int i=0;i<30;i++)

48if(sum)49}

50int minn=7;51

do59}60

}61}62

if(!visit[maxx])

66 visit[maxx]=1;67

}68 minn=min(minn,maxx);

69 }while(next_permutation(b,b+num));    //全排列函式。耗時,但是節省**的長度時可用

70for(int i=0;i)

73 printf("

-> %d\n

",minn);74}

75return0;

76 }

遞迴回溯的**:

1 #include2 #include3 #include

4 #include5 #include6

using

namespace

std;

7char str[100];8

intminn,maxx,num;

9int a[30][30],b[10],c[10],visit[30],goal[10

];10

1112

void dfs(int n,int

maxx)

18for(int i=0;i)28}

29int max_w=max(maxx,w);

30if(max_w

33 visit[b[i]]=0;34

}35}36

}3738int

main()

53int t=str[i++]-'

a'+1;54

while(str[i]=='

')55 i++;

56while(i

61if(str[i]==';'

)65int k=str[i++]-'

a'+1

;66 a[t][k]=1

;67 a[k][t]=1;68

}69}70

}71 num=0;72

for(int i=0;i<30;i++)

77if(sum)78}

79 minn=8

;80 maxx=0

;81 dfs(0,0

);82

for(int i=0;i)

83 printf("

%c ",goal[i]+'

a'-1

);84 printf("

-> %d\n

",minn);

8586}87

return0;

88 }

提供幾組測試資料:

a:fb;b:gc;d:gc;f:agh;e:hd

a:fb;b:gc;d:gc;f:agh;e:h

a:b;b:c;c:d;d:e;e:f;f:g;g:h

a:b;b:c;c:d;d:e;e:f;f:g;g:h;h:a

a:b;b:ce;c:d;d:e;e:f;f:g;g:h;h:a

a:b;b:ce;c:dg;d:e;e:f;f:g;g:h;h:a

a:bcdefgh;b:acdefgh;c:abdefgh;d:abcefgh;e:abcdfgh;f:abcdegh;g:abcdefh;h:abcdefg

#答案:

a b c f g d h e -> 3

c d b g a f e h -> 2

a b c d e f g h -> 1

a b h c g d f e -> 2

c d b e a f h g -> 2

a b h c e g d f -> 3

a b c d e f g h -> 7

UVA639 遞迴 回溯

1 題意 給出一張地圖,x 是牆,是可放的位置,求棋盤上最多放多少個車 中國象棋 2 分析 回溯 注意 在進入下一層的判斷,如果符合某個約束條件,則進入下一層第乙個遞迴例項,不符合或者退出一第乙個遞迴例項後,都應該進入第二個遞迴例項,不然怎麼回溯 另外注意不要忘記在最後一層的遞迴中,return。i...

使用with遞迴回溯

向上回溯,查詢頂級部門 declare pdeptid uniqueidentifier with dept deptid,pdeptid as select udepid,uparentid from oa.dbo.depinfo where udepid in select p.udepid f...

遞迴回溯總結

遞迴回溯法對解空間樹作深度優先搜尋,一般情況可表示為 void backtrack int n else 引數n表示遞迴的深度 is ok 表示已經求得問題解 print reult 表示列印結果 如果只求出乙個可行解,那麼求得第乙個問題解後便可exit 如果要求出所有可行解則不需exit base...