本題題意:尋找乙個排列,在此排序中,頻寬的長度最小(頻寬是指:任意一點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...