题意:

  给一个图, 将其节点以任一序列排列。

  1)计算每个节点距离相邻节点的最大距离 dis[i]

  2)计算出当前序列中, 所有节点的dis[i], 并求出最大的dis[i] : max_dis

  求最小的max_dis, 并且输出此序列。

  节点数不超过8个

思路:

  节点数不超过八个, 那直接进行全排列, 求解最小值即可。

  复杂度为O(n!)

  坑爹的地方在读图, 模拟读图, 得处理好细节, 全排列的生成直接用dfs即可。

代码:

  

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <stack>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-6
#define MAXN 26
#define MAXM 1000
#define dd {cout<<"debug"<<endl;}
#define pa {system("pause");}
#define p(x) {printf("%d\n", x);}
#define pd(x) {printf("%.7lf\n", x);}
#define k(x) {printf("Case %d: ", ++x);}
#define s(x) {scanf("%d", &x);}
#define sd(x) {scanf("%lf", &x);}
#define mes(x, d) {memset(x, d, sizeof(x));}
#define do(i, x) for(i = 0; i < x; i ++)
#define dod(i, x, l) for(i = x; i >= l; i --)
#define doe(i, x) for(i = 1; i <= x; i ++)
int len, max_ans, n;
char str[MAXM];
vector <int> V[MAXN];
int ans[MAXN];
int order[MAXN];
bool vis[MAXN];
void init()
{
memset(ans, , sizeof(ans));
memset(vis, false, sizeof(vis));
memset(order, , sizeof(order));
for (int i = ; i < MAXN; i ++)
V[i].clear();
max_ans = INF;
n = ;
}
void read()
{
len = strlen(str);
bool flag = false;
char ch;
for (int pos = ; pos < len; pos ++)
{
if (str[pos] >= 'A' && str[pos] <= 'Z')
{
if (!vis[str[pos] - 'A'])
{
vis[str[pos] - 'A'] = true;
n ++;
}
if (!flag)
{
ch = str[pos];
flag = true;
}
else
{
if (find(V[ch - 'A'].begin(), V[ch - 'A'].end(), str[pos] - 'A') == V[ch - 'A'].end())
V[ch - 'A'].push_back(str[pos] - 'A');
if (find(V[str[pos] - 'A'].begin(), V[str[pos] - 'A'].end(), ch - 'A') == V[str[pos] - 'A'].end())
V[str[pos] - 'A'].push_back(ch - 'A');
}
}
else if (str[pos] == ';')
{
flag = false;
}
else if (str[pos] == ':')
continue;
}
memset(vis, false, sizeof(vis));
}
void show()
{
printf("%d\n", n);
for (int i = ; i < MAXN; i ++)
if (!V[i].empty())
{
printf("%c:", i + 'A');
for (int j = ; j < V[i].size(); j ++)
printf(" %c", V[i][j] + 'A');
printf("\n");
}
}
int get_ans()
{
int max_num = ;
int temp = ;
for (int i = ; i < MAXN; i ++)
{
temp = ;
if (ans[i] == ) continue;
for (int j = ; j < V[i].size(); j ++)
{
int x = abs(ans[V[i][j]] - ans[i]);
if (x > temp)
temp = x;
}
max_num = max(max_num, temp);
}
return max_num;
}
void dfs(int root, int num)
{
ans[root] = num;
if (num == n)
{
int x = get_ans();
if (x < max_ans)
{
max_ans = x;
for (int i = ; i < MAXN; i ++)
if (ans[i])
order[ans[i]] = i;
}
return ;
} for (int u = ; u < MAXN; u ++)
if (!vis[u] && !V[u].empty())
{
vis[u] = true;
dfs(u, num + );
vis[u] = false;
}
}
void solve()
{
init();
read();
for (int i = ; i < MAXN; i ++)
if (!V[i].empty())
{
memset(vis, false, sizeof(vis));
memset(ans, , sizeof(ans));
vis[i] = true;
dfs(i, );
}
for (int i = ; i <= n; i ++)
printf("%c ", order[i] + 'A');
printf("-> %d\n", max_ans);
} int main()
{
while (gets(str))
{
if (!strcmp(str, "#")) break;
solve();
}
return ;
}

uva 104 Bandwidth的更多相关文章

  1. uva 104 Arbitrage (DP + floyd)

    uva 104 Arbitrage Description Download as PDF Background The use of computers in the finance industr ...

  2. uva 140 bandwidth (好题) ——yhx

     Bandwidth  Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an orde ...

  3. UVa 104 - Arbitrage(Floyd动态规划)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  4. UVa 140 Bandwidth【枚举排列】

    题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列 看的紫书,紫书上说得很详 ...

  5. UVA 140 Bandwidth

    题意: 给出一个n个节点的图G,和一个节点的排列,定义节点i的带宽为i和相邻节点在排列中的最远距离,而所有带宽的最大值就是图的带宽,求让图的带宽最小的排列. 分析: 列出所有可能的排列,记录当前找到的 ...

  6. UVA - 140 Bandwidth(带宽)(全排列)

    题意:给定图,求是带宽最小的结点排列. 分析:结点数最多为8,全排列即可.顶点范围是A~Z. #pragma comment(linker, "/STACK:102400000, 10240 ...

  7. UVA 104 Arbitrage

    动态规划类似FLOYD dp[i][j][k] 表示第i个点经过K次到达j点能获得的最大利润 #include <map> #include <set> #include &l ...

  8. UVA 140 Bandwidth (dfs 剪枝 映射)

    题意: 给定一个n个结点的图G和一个结点的排列, 定义结点i的带宽b(i)为i和相邻结点在排列中的最远距离, 所有b(i)的最大值就是这个图的带宽, 给定G, 求让带宽最小的结点排列. 给定的图 n ...

  9. UVA题解一

    UVA 100 题目描述:经典3n+1问题在\(n \leq 10^6\)已经证明是可行的,现在记\(f[n]\)为从\(n\)开始需要多少步才能到\(1\),给出\(L, R\),问\(f[L], ...

随机推荐

  1. jqzoom基于jQuery的图片放大镜

    1.引入jQuery和jqzoom插件 <script src="/js/common/jquery-1.6.2.js" type="text/javascript ...

  2. Android开发了解——AIDL

    AIDL:Android Interface Definition Language,即Android接口定义语言. 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...

  3. 搭建maven开发环境测试Hadoop组件HDFS文件系统的一些命令

    1.PC已经安装Eclipse Software,测试平台windows10及Centos6.8虚拟机 2.新建maven project 3.打开pom.xml,maven工程项目的pom文件加载以 ...

  4. php中GD库的一些简单使用

    今天了解了一些GD库的简单使用,现在稍微做一下总结! GD库是什么?,graphic device,图像工具库,gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处 ...

  5. HTML5拖拽功能drag

    1.创建拖拽对象 给需要拖拽的元素设置draggable属性,它有三个值: true:元素可以被拖拽:false:元素不能被拖拽:auto: 浏览器自己判断元素是否能被拖拽. 2.处理拖拽事件当我们拖 ...

  6. asp中的几个取整函数fix(),int(),round()的用法

    asp中的几个取整函数是:fix(),int(),round(); Int(number).Fix(number)函数返回数字的整数部分.number 参数可以是任意有效的数值表达式.如果 numbe ...

  7. Linux命令行程序和内建指令

    摘录百度分类 文件系统 cat cd chmod chown chgrp cksum cmp cp du df fsck fuser ln ls lsattr lsof mkdir mount mv ...

  8. excel知识

    excel中导出文本中的制表符去除方法:

  9. iOS获取webview高度

    int webHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scr ...

  10. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...