uva 104 Bandwidth
题意:
给一个图, 将其节点以任一序列排列。
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的更多相关文章
- uva 104 Arbitrage (DP + floyd)
uva 104 Arbitrage Description Download as PDF Background The use of computers in the finance industr ...
- 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 ...
- UVa 104 - Arbitrage(Floyd动态规划)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- UVa 140 Bandwidth【枚举排列】
题意:给出n个节点的图,和一个节点的排列,定义节点i的带宽b[i]为i和其相邻节点在排列中的最远的距离,所有的b[i]的最大值为这个图的带宽,给一个图,求出带宽最小的节点排列 看的紫书,紫书上说得很详 ...
- UVA 140 Bandwidth
题意: 给出一个n个节点的图G,和一个节点的排列,定义节点i的带宽为i和相邻节点在排列中的最远距离,而所有带宽的最大值就是图的带宽,求让图的带宽最小的排列. 分析: 列出所有可能的排列,记录当前找到的 ...
- UVA - 140 Bandwidth(带宽)(全排列)
题意:给定图,求是带宽最小的结点排列. 分析:结点数最多为8,全排列即可.顶点范围是A~Z. #pragma comment(linker, "/STACK:102400000, 10240 ...
- UVA 104 Arbitrage
动态规划类似FLOYD dp[i][j][k] 表示第i个点经过K次到达j点能获得的最大利润 #include <map> #include <set> #include &l ...
- UVA 140 Bandwidth (dfs 剪枝 映射)
题意: 给定一个n个结点的图G和一个结点的排列, 定义结点i的带宽b(i)为i和相邻结点在排列中的最远距离, 所有b(i)的最大值就是这个图的带宽, 给定G, 求让带宽最小的结点排列. 给定的图 n ...
- UVA题解一
UVA 100 题目描述:经典3n+1问题在\(n \leq 10^6\)已经证明是可行的,现在记\(f[n]\)为从\(n\)开始需要多少步才能到\(1\),给出\(L, R\),问\(f[L], ...
随机推荐
- jqzoom基于jQuery的图片放大镜
1.引入jQuery和jqzoom插件 <script src="/js/common/jquery-1.6.2.js" type="text/javascript ...
- Android开发了解——AIDL
AIDL:Android Interface Definition Language,即Android接口定义语言. 什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...
- 搭建maven开发环境测试Hadoop组件HDFS文件系统的一些命令
1.PC已经安装Eclipse Software,测试平台windows10及Centos6.8虚拟机 2.新建maven project 3.打开pom.xml,maven工程项目的pom文件加载以 ...
- php中GD库的一些简单使用
今天了解了一些GD库的简单使用,现在稍微做一下总结! GD库是什么?,graphic device,图像工具库,gd库是php处理图形的扩展库,gd库提供了一系列用来处理图片的API,使用GD库可以处 ...
- HTML5拖拽功能drag
1.创建拖拽对象 给需要拖拽的元素设置draggable属性,它有三个值: true:元素可以被拖拽:false:元素不能被拖拽:auto: 浏览器自己判断元素是否能被拖拽. 2.处理拖拽事件当我们拖 ...
- asp中的几个取整函数fix(),int(),round()的用法
asp中的几个取整函数是:fix(),int(),round(); Int(number).Fix(number)函数返回数字的整数部分.number 参数可以是任意有效的数值表达式.如果 numbe ...
- Linux命令行程序和内建指令
摘录百度分类 文件系统 cat cd chmod chown chgrp cksum cmp cp du df fsck fuser ln ls lsattr lsof mkdir mount mv ...
- excel知识
excel中导出文本中的制表符去除方法:
- iOS获取webview高度
int webHeight = [[webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.scr ...
- 12天学好C语言——记录我的C语言学习之路(Day 8)
12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...