UVa 140 - Bandwidth
2016-04-14 14:25
344 查看
題目:已知一個無向圖,求一個最小的字典序列,是的聯通的節點之間的序號最大差值最小。
分析:圖論,搜索。記錄節點然後回溯即可。
說明:注意節點不一定的從A開始的連續字母╮(╯▽╰)╭。
#include <cstring>
#include <cstdio>
char buf[99], link[8][8], used[26], save[8], ans[8], str[8];
int maxbandwidths;
void dfs(int d, int n)
{
if (d >= n) {
int max = 0;
for (int i = 0; i < d; ++ i)
for (int j = 0; j < i; ++ j)
if (link[save[j]][save[i]] && max < i-j)
max = i-j;
if (maxbandwidths > max) {
maxbandwidths = max;
for (int j = 0; j < d; ++ j)
ans[j] = save[j];
}
}
for (int i = 0; i < n; ++ i)
if (!used[i]) {
used[i] = 1;
save[d] = str[i];
dfs(d+1, n);
used[i] = 0;
}
}
int main()
{
while (~scanf("%s",buf) && buf[0] != '#') {
int v, u, edge_node = 0;
memset(link, 0, sizeof(link));
memset(used, 0, sizeof(used));
for (int i = 0; buf[i]; ++ i) {
if (buf[i] == ':') {
edge_node = 1;
v = buf[i-1]-'A';
used[v] = 1;
}else if (buf[i] == ';')
edge_node = 0;
else if (edge_node) {
u = buf[i]-'A';
link[v][u] = 1;
link[u][v] = 1;
used[u] = 1;
}
}
int size = 0;
for (int i = 0; i < 26; ++ i)
if (used[i]) {
str[size ++] = i;
used[i] = 0;
}
maxbandwidths = 8;
dfs(0, size);
for (int i = 0; i < size; ++ i)
printf("%c ",ans[i]+'A');
printf("-> %d\n",maxbandwidths);
}
return 0;
}
分析:圖論,搜索。記錄節點然後回溯即可。
說明:注意節點不一定的從A開始的連續字母╮(╯▽╰)╭。
#include <cstring>
#include <cstdio>
char buf[99], link[8][8], used[26], save[8], ans[8], str[8];
int maxbandwidths;
void dfs(int d, int n)
{
if (d >= n) {
int max = 0;
for (int i = 0; i < d; ++ i)
for (int j = 0; j < i; ++ j)
if (link[save[j]][save[i]] && max < i-j)
max = i-j;
if (maxbandwidths > max) {
maxbandwidths = max;
for (int j = 0; j < d; ++ j)
ans[j] = save[j];
}
}
for (int i = 0; i < n; ++ i)
if (!used[i]) {
used[i] = 1;
save[d] = str[i];
dfs(d+1, n);
used[i] = 0;
}
}
int main()
{
while (~scanf("%s",buf) && buf[0] != '#') {
int v, u, edge_node = 0;
memset(link, 0, sizeof(link));
memset(used, 0, sizeof(used));
for (int i = 0; buf[i]; ++ i) {
if (buf[i] == ':') {
edge_node = 1;
v = buf[i-1]-'A';
used[v] = 1;
}else if (buf[i] == ';')
edge_node = 0;
else if (edge_node) {
u = buf[i]-'A';
link[v][u] = 1;
link[u][v] = 1;
used[u] = 1;
}
}
int size = 0;
for (int i = 0; i < 26; ++ i)
if (used[i]) {
str[size ++] = i;
used[i] = 0;
}
maxbandwidths = 8;
dfs(0, size);
for (int i = 0; i < size; ++ i)
printf("%c ",ans[i]+'A');
printf("-> %d\n",maxbandwidths);
}
return 0;
}
相关文章推荐
- C pirmer Plus(第五版) 第十四章 课后习题 3
- 谈谈eclipse使用技巧二
- JAVA的StringBuffer类
- iOS开发中UITextField限制输入文字个数
- volley学习体验
- Android之Fragment学习笔记②(Fragment生命周期)
- oracle跟踪sql语句
- EasyEclipse for php .project文件
- MapReduce
- ubuntu环境hadoop全分布式模式配置过程
- 存货跌价准备计算
- DetachedCriteria详细使用
- eclipse使用技巧一
- Xcode 7:无需99刀也能在真机上测试App
- Android流式布局实现
- Sublime 笔记
- iOS开发者最需要的15个网站
- 中文分词词性对照表
- struct stat结构体简介
- iOS手势学习笔记