uva-140
2017-03-14 20:12
281 查看
暴力搜索
数组太多,代码长,容易遗漏出错。
剪枝搜索
#include<cstring>
#include<sstream>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
set<int>s;
const int INF=99999999999;
int G[110][110]={0};
int v[10]={0},ans[10]={0};
int pos[110]={0};
int vis[110]={0};
void read_graph(string &line){
memset(G,0,sizeof(G));
memset(v,0,sizeof(v));
memset(ans,0,sizeof(ans));
memset(pos,0,sizeof(ans));
memset(vis,0,sizeof(vis));
int i=0;
while(i<line.size()){
int root=line[i];
s.insert(line[i]);
i+=2;
while(line[i]!=';'&&i<line.size()){
G[root][line[i]]=1;
G[line[i]][root]=1;
s.insert(line[i]);
i++;
}
i++;
}
}
int min1=INF;
int update(int p,int x){
int t;
for(int i=1;i<p;i++)
if(G[v[i]][v[p]])
if(x<(t=abs(pos[v[i]]-pos[v[p]])))
x=t;
return x;
}
void dfs(int cnt,int wid){
if(cnt==s.size()+1){
if(min1>wid){
min1=wid;
memcpy(ans,v,sizeof(v));
}
return;
}
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){
if(vis[*it])continue;
vis[*it]=1;
pos[*it]=cnt;
v[cnt]=*it;
int w;
if((w=update(cnt,wid))<min1)
dfs(cnt+1,w);
v[cnt]=0;
pos[*it]=0;
vis[*it]=0;
}
}
int main(){
string line;
while(getline(cin,line)&&line[0]!='#'){
read_graph(line);
dfs(1,0);
for(int i=1;i<=s.size();i++)
printf("%c ",ans[i]);
printf("-> %d\n",min1);
line.clear();
min1=INF;
s.clear();
}
return 0;}
AC,大量数组,集合,细节容易出错,
#include<cstdio> #include<iostream> #include<algorithm> #include<sstream> #include<cstring> #include<vector> #include<cmath> using namespace std; int m=9999999999; vector<int>ch[110],v; int vis[110]={0},pos[110]={0},ans[110]; void read_graph(string &line){ memset(ch,0,sizeof(ch)); memset(vis,0,sizeof(vis)); int len=line.size(); int i=0; while(i<len){ vis[line[i]]=1; int root=line[i]; i+=2; while(line[i]!=';'&&i<len){ ch[root].push_back(line[i]);//根节点相邻结点 vis[line[i]]=1;//记录出现哪些字母 i++; } i++; } } int brand_width(){ int max=0,t; for(int i=0;i<v.size();i++){ for(int j=0;j<ch[v[i]].size();j++){ if(max<(t=(abs(pos[v[i]]-pos[ch[v[i]][j]]))))max=t; } } return max; } void dfs(int cnt){ int x; if(cnt==v.size()+1){ if(m>(x=brand_width())){ m=x; //printf("%d\n",m); memcpy(ans,pos,sizeof(pos)); } return; } for(int i=0;i<v.size();i++){ if(pos[v[i]])continue;//记录位置,方便查询 pos[v[i]]=cnt; dfs(cnt+1); pos[v[i]]=0; } } int main(){ string line; while(getline(cin,line)&&line[0]!='#'){ read_graph(line); for(int i='A';i<='Z';i++) if(vis[i])v.push_back(i); dfs(1); char ss[100]; for(int i=0;i<v.size();i++) ss[ans[v[i]]]=v[i]; for(int i=1;i<=v.size();i++) printf("%c ",ss[i]); printf("-> %d\n",m); line.clear(); } return 0;}时间复杂度近似于n^4;
数组太多,代码长,容易遗漏出错。
剪枝搜索
#include<cstring>
#include<sstream>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
set<int>s;
const int INF=99999999999;
int G[110][110]={0};
int v[10]={0},ans[10]={0};
int pos[110]={0};
int vis[110]={0};
void read_graph(string &line){
memset(G,0,sizeof(G));
memset(v,0,sizeof(v));
memset(ans,0,sizeof(ans));
memset(pos,0,sizeof(ans));
memset(vis,0,sizeof(vis));
int i=0;
while(i<line.size()){
int root=line[i];
s.insert(line[i]);
i+=2;
while(line[i]!=';'&&i<line.size()){
G[root][line[i]]=1;
G[line[i]][root]=1;
s.insert(line[i]);
i++;
}
i++;
}
}
int min1=INF;
int update(int p,int x){
int t;
for(int i=1;i<p;i++)
if(G[v[i]][v[p]])
if(x<(t=abs(pos[v[i]]-pos[v[p]])))
x=t;
return x;
}
void dfs(int cnt,int wid){
if(cnt==s.size()+1){
if(min1>wid){
min1=wid;
memcpy(ans,v,sizeof(v));
}
return;
}
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){
if(vis[*it])continue;
vis[*it]=1;
pos[*it]=cnt;
v[cnt]=*it;
int w;
if((w=update(cnt,wid))<min1)
dfs(cnt+1,w);
v[cnt]=0;
pos[*it]=0;
vis[*it]=0;
}
}
int main(){
string line;
while(getline(cin,line)&&line[0]!='#'){
read_graph(line);
dfs(1,0);
for(int i=1;i<=s.size();i++)
printf("%c ",ans[i]);
printf("-> %d\n",min1);
line.clear();
min1=INF;
s.clear();
}
return 0;}
AC,大量数组,集合,细节容易出错,
相关文章推荐
- UVa 140 - BandWidth 解题报告(暴力)
- UVA140
- UVa 140 Bandwidth【枚举排列】
- uva 140 Bandwidth
- UVA 140_Bandwidth
- uva140 - Bandwidth
- UVa 140 - Bandwidth
- Bandwidth UVA - 140(next_premutation)
- uva140 - Bandwidth
- 紫书搜索 例题7-6 UVA - 140 Bandwidth
- uva 140 Bandwidth 带宽
- UVA - 140 Bandwidth
- UVaOJ140 - Bandwidth
- UVa 140 - Bandwidth
- UVA 140(p196)----Bandwidth
- UVA 140 (13.07.29)
- UVA-140 Bandwidth 带宽
- 例题7-6 带宽 UVa140
- Bandwidth UVA-140
- UVa 140 Bandwidth