UVa 140 Bandwidth【枚举排列】

题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列

看的紫书,紫书上说得很详细--

看标程的时候算每个图的带宽的时候看了好久,原来是这样的

打印出u[i],v[i]的值就知道了

样例:

A:FB;B:GC;D:GC;F:AGH;E:HD
#

UVa 140 Bandwidth【枚举排列】

对于每一个u[i],v[i],abs(u[i]-v[i])就是相邻节点之间的距离, 再在这里面找出最大值

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; char input[maxn];
int id[maxn],letter[maxn]; int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(scanf("%s",input)!=EOF&&input[]!='#'){
int n=;
for(char ch='A';ch<='Z';ch++){//输入处理
if(strchr(input,ch)!=NULL){
id[ch]=n++;
letter[id[ch]]=ch;
} } int len=strlen(input),p=,q=;
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+;i<q;i++){
u.push_back(id[input[p-]]);
v.push_back(id[input[i]]);
} p++;q++;//都向后挪一位,不挪的话,p位置一直是‘:’,q位置一直是';',就超时了
} int P[maxn],bestP[maxn],pos[maxn],ans=n; for(int i=;i<n;i++) P[i]=i;
do{
for(int i=;i<n;i++) pos[P[i]]=i;//记录下在这个排列中的位置 int bandwidth=; for(int i=;i<u.size();i++)
bandwidth=max(bandwidth,abs(pos[u[i]]-pos[v[i]]));//求出当前的带宽 if(bandwidth<ans){//维护一个最小的带宽的值,并保存下此时的排列
ans=bandwidth;
memcpy(bestP,P,sizeof(P));
}
} while(next_permutation(P,P+n)); for(int i=;i<n;i++) printf("%c ",letter[bestP[i]]);
printf("-> %d\n",ans);
}
return ; }
上一篇:Tomcat web.xml中定义了文件扩展名到MIME类型的对应关系


下一篇:django设置时区与语言