UVa 140 - Bandwidth

来源:互联网 发布:oppo手机怎么解网络锁 编辑:程序博客网 时间:2024/05/23 13:03

題目:已知一個無向圖,求一個最小的字典序列,是的聯通的節點之間的序號最大差值最小。

分析:圖論,搜索。記錄節點然後回溯即可。

說明:注意節點不一定的從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;}


0 0
原创粉丝点击