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], ...
随机推荐
- docker no permmition problem
resolved by: sudo docker run --privileged ....
- 深入理解计算机系统第二版习题解答CSAPP 2.10
对于任一位向量a,有a ^ a = 0.考虑下面的程序: void inplace_swap(int *x, int *y) { *y = *x ^ *y; *x = *x ^ *y; *y = *x ...
- nginx查看日志
原文:nginx日志格式及自定义日志配置 nginx的log日志分为access log 和 error log 其中access log 记录了哪些用户,哪些页面以及用户浏览器.ip和其他的访问信息 ...
- 关于JFace中的进度条对话框(ProgressMonitorDialog类)
在Windows操作系统中,最常用的进度条对话框就是文件复制时的弹出框,如果想让用户愉快的使用你开发 的软件,那么在执行某个较长时间的操作时候,就应该弹出一个进度条提示框,告诉用户程序正在做什么. 做 ...
- 用gd库画矩形和椭圆
画矩形:bool imagerectangle ( resource $image画布资源 , int $x1左上角的坐标 , int $y1 , int $x2 右下角坐标, int $y2 , i ...
- db.class的实现类
单例类,能操作数据库,能拼接sql语句,能写入日志 <?php class mysql extends db{ private static $ins=null; private $conn=n ...
- C++多态性与C#的比较
多态性:统一操作作用于不同的对象可以有不同的解释,产生不同的执行结果.多态性可以分为两种:一是编译时的多态性,一是运行时的多态性. 编译时的多态性包括重载.覆盖.运算符重载.对于非虚的 ...
- SQL Server 2012 中 Update FROM子句
首先说明一下需求以及环境 创建Table1以及Table2两张表,并插入一下数据 USE AdventureWorks2012; GO IF OBJECT_ID ('dbo.Table1', 'U') ...
- JD(转载)
时间:2012-9-11 地点:川大 我只能说第一家公司,不是一般的火爆.不得不吐槽一下: 京东宣讲完全没有计划,只看到个下午两点半宣讲,结果跑过去,下午两点是宣讲管培的.在川大外的德克士呆了一下午. ...
- JavaScript高级程序设计(九):基本概念----函数
一.参数的理解 1.ECMAScript中的参数在内部是用一个数组来表示的.函数接收到的始终是这个数组,而不关心数组中包含多少个参数,即使没有参数也可以. 2.实质上,函数可以通过arguments对 ...