您的位置:首页 > 其它

uva 140 Bandwidth

2016-06-05 15:18 375 查看
此题结点最多8个且时间有3s,所以用next_permutation最好

第一个for循环是用来找出所有结点的,并且把结点按顺序放进letter里面,方面最后访问,并且用n记录一共有多少个结点。

第二个for循环是用来存储结点的对应关系的,每个起始结点对应终止结点,方便接下来算贷款。

pos数组用来存放位置,P数组代表结点的排列,pos[P[i]]=i的意思是P结点代表的字母放在i这个位置,两个pos相减则代表了带宽的宽度,用ans来记录最小。

最后bestp里存放了最优的排列,只需要用这个数组去访问letter就可以找出结点排列序列了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int id[256],letter[10];
char input[1000];
int main()
{
while(scanf("%s",input)&&input[0]!='#')
{
int n=0;
for(int ch='A';ch<='Z';ch++)
{
if(strchr(input,ch)!=NULL){
id[ch]=n++;
letter[id[ch]]=ch;
}
}
int len=(int)strlen(input),p=0,q=0;
vector<int> u,v;
for(;;)
{
while(p<len&&input[p]!=':') p++;
if(p>=len) break;
while(q<len&&input[q]!=';') q++;
for(int i=p+1;i<q;i++)
{
u.push_back(id[input[p-1]]);
v.push_back(id[input[i]]);
}
p++,q++;
}
int P[10],bestp[10],pos[10],ans=n;
for(int i=0;i<n;i++) P[i]=i;
do{
for(int i=0;i<n;i++) pos[P[i]]=i;
int Bandwith=0;
for(int i=0;i<u.size();i++)
Bandwith=max(Bandwith,abs(pos[u[i]]-pos[v[i]]));
if(Bandwith<ans)
{
ans=Bandwith;
memcpy(bestp,P,sizeof(P));
}
}while(next_permutation(P,P+n));
printf("%c",letter[bestp[0]]);
for(int i=1;i<n;i++) printf(" %c",letter[bestp[i]]);
printf(" -> %d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: