題目鏈接
思路:
- next_permutation()+判斷
- dfs+剪枝
C++代碼
next_permutation()+判斷:
#include<bits/stdc++.h>
using namespace std;
const int maxn=30;
int G[maxn][maxn],used[maxn],str[maxn],ans[maxn];
int main(){
string s;
while(getline(cin,s)){
memset(G,0,sizeof(G));
memset(used,0,sizeof(used));
if(s[0]=='#') break;
int a,b;
for(int i=0;i<s.length();i++){
b=s[i]-'A';
if(s[i]==':') a=s[i-1]-'A';
if(isalpha(s[i])&&s[i+1]!=':') G[a][b]=G[b][a]=1,used[a]=used[b]=1;
}
int size=0;
for(int i=0;i<maxn;i++)
if(used[i])
str[size++]=i;
int mind=0x7777777,maxd;
do{
maxd=0;
for(int i=0;i<size;i++)
for(int j=0;j<i;j++)
if(G[str[i]][str[j]]&&maxd<i-j)
maxd=i-j;
if(mind>maxd){
mind=maxd;
for(int i=0;i<size;i++)
ans[i]=str[i];
}
}while(next_permutation(str,str+size));
for(int i=0;i<size;i++) printf("%c ",ans[i]+'A');
printf("-> %d\n",mind);
}
return 0;
}
dfs+剪枝:
#include <bits/stdc++.h>
using namespace std;
char buf[99], link[8][8], used[26], save[8], ans[8], str[8];
int maxbandwidths;
void dfs(int d,int n)
{
if (d==n) {
int max = 0;
for (int i = 0; i < d; ++ i)
for (int j = 0; j < i; ++ j)
if (link[save[j]][save[i]] && max < i-j)
max = i-j;
if (maxbandwidths > max) {
maxbandwidths = max;
for (int j = 0; j < d; ++ j)
ans[j] = save[j];
}
}
for (int i = 0; i < n; ++ i)
if (!used[i]) {
used[i] = 1;
save[d] = str[i];
dfs(d+1, n);
used[i] = 0;
}
}
int main()
{
while (~scanf("%s",buf) && buf[0] != '#') {
int v, u;
memset(link, 0, sizeof(link));
memset(used, 0, sizeof(used));
for (int i = 0; buf[i]; ++ i) {
if (buf[i]==':') v = buf[i-1]-'A';
if (buf[i+1]!=':'&&isalpha(buf[i])){
u = buf[i]-'A';
link[v][u] = link[u][v] = 1;
used[u] = used[v] = 1;
}
}
int size = 0;
for (int i = 0; i < 26; ++ i)
if (used[i]) {
str[size ++] = i;
used[i] = 0;
}
maxbandwidths = 8;
dfs(0, size);
for (int i = 0; i < size; ++ i)
printf("%c ",ans[i]+'A');
printf("-> %d\n",maxbandwidths);
}
return 0;
}