您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: