您的位置:首页 > 其它

UVA-140 Bandwidth

2015-04-20 22:35 369 查看
bandwith指在一个给定排列中 一个点与相连点的距离,所有点bandwith最大值为排列的bandwidth
给定节点和路径找出bandwidth排列,如果有多个排列bandwidth一样,输出字典序最小的一个
用一个vector保存路径,暴力枚举,找出所求排列
没想到没有优化直接枚举竟然不超时。。。

#include<bits/stdc++.h>
using namespace std;
string ans1;
int ans2;
int len(string s,char a,char b){
int x,y;
for(int i=0;i<s.length();i++){
if(s[i]==a) x=i;
if(s[i]==b) y=i;
}
return (x>y)?x-y:y-x;
}
void bandwidth(string s,vector<int>* board){
int ans=0;
for(int i=0;i<26;i++){
for(int j=0;j<26;j++){
if(board[i][j]==1){
int l=len(s,i+'A',j+'A');
if(l>ans){
ans=l;
}
}
}
}
if(ans<ans2){
ans2=ans;
ans1=s;
}
}
void dfs(string s,vector<int>* board,set<char>& node){
if(s.length()==node.size()){
bandwidth(s,board);
}
else {
s.resize(s.length()+1);
for(set<char>::iterator i=node.begin();i!=node.end();i++){
s[s.length()-1]=*i;
int ok=1;
for(int j=0;j<s.length()-1;j++)
if((*i)==s[j]) ok=0;
if(ok){
dfs(s,board,node);
}
}
}
}
int main()
{
string line;
stringstream ll;
while(getline(cin,line)&&line!="#"){
vector<int> board[26];
for(int i=0;i<26;i++) board[i].resize(26);
ll<<line;
char c;
set<char> node;
while(ll>>c){
char t=c;
node.insert(c);
ll>>c;
while(ll>>c&&c!=';'){
board[c-'A'][t-'A']=board[t-'A'][c-'A']=1;
node.insert(c);
}
}
ll.clear();
/*cout<<"  ";
for(int i=0;i<26;i++) cout<<(char)('A'+i)<<" ";
cout<<endl;
for(int i=0;i<26;i++){
cout<<(char)('A'+i)<<" ";
for(int j=0;j<26;j++)
if(j==25) cout<<board[i][j]<<endl;
else cout<<board[i][j]<<" ";
}*/
string s;
ans1.clear();
ans2=999;
dfs(s,board,node);
for(int i=0;i<ans1.length();i++){
cout<<ans1[i]<<" ";
}
cout<<"-> ";
cout<<ans2<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: