这题就是求一个全排列,判断最小的最大带宽。加上剪枝优化让程序更快速,当前已经有一个最小值的时候,若此时结果的到了一个更大的带宽,就不用处理了。
这题输入处理和带宽计算要弄清楚:
输入处理,直接用二维标记a和b是否相邻。 这里e是存下出现的字母(后面有去重处理,也可以直接set),mp是标记两个字母是否能够到达。
char ch; int t = 1; mi = INF;
for(int i=0;i<(int)s.size();i++)
{
if(s[i] == ':')
{
t = 0;
continue;
}
if(s[i] == ';')
{
t = 1;
continue;
}
if(t == 1) ch = s[i];
else
{
mp[ch][s[i]] = 1;
mp[s[i]][ch] = 1;
}
if(isalpha(s[i])) e.push_back(s[i]);
}
下面就是计算当前得到的一个序列中带宽的最大值
int f(char x[],int n)
{
int res = 0;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(mp[x[i]][x[j]] == 1)
res = max(res,abs(i-j));
}
}
return res;
}
剩下 dfs 里面 就是全排列 加一个剪枝 和 求最大带宽,注意定义的summ
void dfs(int cur,int sum)
{
if(sum >= mi) return ;
if(cur == (int)e.size())
{
mi = sum;
for(int i=0;i<cur;i++) res[i] = now[i];
return ;
}
for(int i=0;i<(int)e.size();i++)
{
if(!book[(int)e[i]])
{
book[(int)e[i]] = true;
now[cur] = e[i];
int summ = max(sum,f(now,cur));//不能直接修改当前sum的值
dfs(cur+1,summ);
book[(int)e[i]] = false;
}
}
}
总代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double eps = 1e-4;
const int mod = 1e9+7;
const int N = 10;
int mp[N*30][N*30];
vector<char> e;
int mi = INF;
char res[N],now[N];
bool book[N*30];
int f(char x[],int n)
{
int res = 0;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(mp[x[i]][x[j]] == 1)
res = max(res,abs(i-j));
}
}
return res;
}
void dfs(int cur,int sum)
{
if(sum >= mi) return ;
if(cur == (int)e.size())
{
mi = sum;
for(int i=0;i<cur;i++) res[i] = now[i];
return ;
}
for(int i=0;i<(int)e.size();i++)
{
if(!book[(int)e[i]])
{
book[(int)e[i]] = true;
now[cur] = e[i];
int summ = max(sum,f(now,cur));
dfs(cur+1,summ);
book[(int)e[i]] = false;
}
}
}
int main(){
string s;
while(cin>>s && s != "#")
{
memset(book,false,sizeof(book));
memset(mp,0,sizeof(mp));
e.clear();
char ch; int t = 1; mi = INF;
for(int i=0;i<(int)s.size();i++)
{
if(s[i] == ':')
{
t = 0;
continue;
}
if(s[i] == ';')
{
t = 1;
continue;
}
if(t == 1) ch = s[i];
else
{
mp[ch][s[i]] = 1;
mp[s[i]][ch] = 1;
}
if(isalpha(s[i])) e.push_back(s[i]);
}
sort(e.begin(),e.end());
e.erase(unique(e.begin(),e.end()),e.end());
dfs(0,0);
for(int i=0;i<(int)e.size();i++) cout<<res[i]<<" ";
cout<<"-> "<<mi<<endl;
}
return 0;
}