您的位置:首页 > 其它

UVa-140 - Bandwidth

2015-07-20 00:12 225 查看
决定跳过数据结构那章,来看暴力求解法。暴力这章之前也看过,可是前几天做了一道POJ的暴力题,却没有想起来自己曾经在书上看过类似的暴力枚举解法,所以决定再仔细看一遍。感觉要是不刷题,只是单纯的看书的话,记不住啊。

书中也说了,可以剪枝(“发现两个结点的距离大于或等于k”,“如果在搜索到结点u时,u结点还有m个相邻点没有确定位置”),不过这只能跳过当前排列而已,对减少时间复杂度的意义不是太大,所以我就还是贴上自己原本的代码。

前几天买了侯捷的《STL源码剖析》,最近在研究STL,真好用,比如这个题直接用next_permutation,方便极了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx=100;
const int maxn=250;
int main()
{
char s[maxx]={};
while(~scanf("%s",s)&&s[0]!='#')
{
int len=strlen(s);
bool f[maxn]={};
bool mg[maxn][maxn]={};
char a,b;
bool f1=0;
char v[maxn]={};
int n=0;
for(int i=0;i<len;i++)
{
if(s[i]==':')
{
f1=1;
continue;
}
if(s[i]==';')
{
f1=0;
continue;
}
if(!f[s[i]])
{
v[n++]=s[i];
f[s[i]]=1;
}
if(f1==0) a=s[i];
else
{
b=s[i];
mg[a][b]=mg[b][a]=1;
}
}
sort(v,v+n);
char vans[maxn]={};
int ans=1e9;
do
{
int tans=0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
if(mg[v[i]][v[j]]) tans=max(tans,j-i);
if(tans<ans)
{
strcpy(vans,v);
ans=tans;
}
}while(next_permutation(v,v+n));
for(int i=0;i<n;i++) printf("%c ",vans[i]);
printf("-> %d\n",ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: