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就可以找出结点排列序列了。
第一个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; }
相关文章推荐
- 第十/十一周项目五-摩托车继承自行车和机动车
- FSDataInputStream
- 算法与数据结构 - 堆
- Uva10152
- [团队项目]第二个冲刺
- MTK平台编译环境设置
- 在子线程 中更新UI的代码
- ACM天梯赛练习L1-004. 计算摄氏温度
- SpringMVC整合fastjson
- ByteBuffer和ByteBuf源码解析
- UVA657
- C编译: 动态连接库 (.so文件)
- 日常生活
- Unity_二维纹理 Texture 2D_1_Properties 属性
- 远程终端登录介绍
- USACO-Party Lamps
- 软件架构漫谈
- ACM天梯赛练习L1-003. 个位数统计
- jsp页面在IE8下文本模式自动为“杂项(Quirks)”导致页面显示错位
- AngulaJs 会动的时间