我写成这样不忍直视。。。
大概是自己实现了我的第一个回溯法
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
int link[30][30];
int node[30];
int vis[30],sum,mutation[30],ans[30];
char a[1000],x,y;
long long minn,maxn;
int mark=0;
//void m(){
// cout<<"H"<<mark++<<endl;
//}
//void out(){
// for(int i=0;i<26;i++){
// for(int k=0;k<26;k++){
// if(link[i][k]){
// printf("%c%c ",i+65,k+65);
// }
// }
// }
//}
//void look(int cur)
//{
// for(int i=0;i<cur;i++){
// printf("%c",mutation[i]+65);
//
// }
// cout<<" "<<minn<<" "<<maxn;
// cout<<"\n";
//}
void dfs(int cur){
//look(cur);
if(cur==sum){
if(maxn<minn){
for(int i=0;i<sum;i++){
ans[i]=mutation[i];
}
minn=maxn;
// maxn=0;
}
}
else{
for(int i=0;i<26;i++){
if(node[i]&&!vis[i]){
mutation[cur]=i;
long long tem=maxn;
for(int j=0;j<cur;j++){
if(link[mutation[cur]][mutation[j]]&&(cur-j>maxn)){
if(maxn>minn){
return; //剪枝
}
else maxn=cur-j; //统计新加入的元素最大度数
}
}
vis[mutation[cur]]=1;
dfs(cur+1);
maxn=tem;//关键的修改
vis[mutation[cur]]=0;
}
}
}
return ;
}
int main()
{
// freopen("t.in","r",stdin);
// freopen("t.out","w",stdout);
//cout<<"C;"<<endl;
while(1){
//cout<<"B"<<endl;
cin.getline(a,sizeof(a));
//cout<<"a"<<endl;
if(a[0]=='#')break;
//cout<<"AAA"<<endl;
memset(link,0,sizeof(link));
memset(node,0,sizeof(node));
memset(vis,0,sizeof(vis));
memset(mutation,0,sizeof(mutation));
memset(ans,0,sizeof(ans));
//cout<<"HI"<<endl;
int point=0;
int len=strlen(a);
//m();
sum=0;
while(1){
if(point>len-1)break;
x=a[point];
if(node[x-65]==0){
node[x-65]=1;
sum++;
}
point++;
while(a[point]!=';'){
if(a[point]>='A'&&a[point]<='Z'){
y=a[point];
link[x-65][y-65]=1;
link[y-65][x-65]=1;
if(node[y-65]==0){
node[y-65]=1;
sum++;
}
}
point++;
if(point>len-1)break;
}
if(a[point]==';')point++;
}
//m();
//out();
//printf("\n");
//cout<<sum<<endl;
minn=1000000000;
dfs(0);
for(int k=0;k<sum;k++){
printf("%c ",ans[k]+65);
}
cout<<"-> "<<minn<<endl;
}
return 0;
}