题目:Bandwidth
题意:输入图,求图中结点全排列的中每个节点到像领节点的最大值的最大值,且输出该排列。
思路:dfs。注意字典序。原准备按输入顺序给节点标号,结果无法满足字典序,于是重写。注意数据中有多余空格。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<map>
#include<algorithm>
#include<sstream>
using namespace std;
bool g[27][27]= {0};
map<int,int> mp;
int cnt=0;
vector<int> record;
bool use[27]= {0};
int Max=(1<<30);
void init() {
memset(g,0,sizeof(g));
mp.clear();
cnt=0;
record.clear();
memset(use,0,sizeof(use));
Max=(1<<30);
}
int judge(vector<int> vec) {
int M=0;
for(int i=0; i<vec.size(); i++) {
for(int j=i+1; j<vec.size(); j++) {
if(g[vec[i]][vec[j]]) {
M=max(M,j-i);
}
}
}
return M;
}
void dfs(int x,vector<int> vec) {
int f=judge(vec);
if(f>=Max) return ;
if(x>cnt) {
record=vec;
Max=f;
}
for(int i=1; i<=26; i++) {
if(!use[i]&&mp.count(i)) {
use[i]=true;
vec.push_back(i);
dfs(x+1,vec);
vec.pop_back();
use[i]=false;
}
}
return ;
}
int main() {
string x;
while(getline(cin,x)&&x[0]!='#') {
init();
string b;
stringstream ss(x);
string bb;
x="";
while(ss>>bb) x+=bb;
x+=';';
int y;
while((y=x.find(';'))!=x.npos) {
string z=x.substr(0,y);
x=x.substr(y+1,x.size()-y-1);
for(int i=2; i<z.size(); i++) {
if(!mp.count(z[0]-'A'+1)) mp[z[0]-'A'+1]=++cnt;
if(!mp.count(z[i]-'A'+1)) mp[z[i]-'A'+1]=++cnt;
g[z[0]-'A'+1][z[i]-'A'+1]=true;
g[z[i]-'A'+1][z[0]-'A'+1]=true;
}
}
vector<int> vec;
dfs(1,vec);
for(int i=0; i<record.size(); i++) {
cout<<((char)(record[i]-1+'A'))<<' ';
}
cout<<"-> "<<Max<<endl;
}
return 0;
}