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], ...
随机推荐
- Flume简介与使用(三)——Kafka Sink消费数据之Kafka安装
前面已经介绍了如何利用Thrift Source生产数据,今天介绍如何用Kafka Sink消费数据. 其实之前已经在Flume配置文件里设置了用Kafka Sink消费数据 agent1.sinks ...
- swift基本运算符
一.空合运算符(Nil Coalescing Operator) 形式:a??b,如果a包含值则解封,否则返回默认值b 条件:a必须为optional类型,这个就不多说了,就是可选类型:默认值b的类型 ...
- 盒模型Box Model(浮动)
一.标准盒模型的大小:border+padding+content(width) 怪异盒模型大小:padding+border 二.display inline 默认,且变为行由内 ...
- 关于IO的一些数字
http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/people ...
- 【MINA】OrderedThreadPoolExecutor和UnorderedThreadPoolExecutor的事件监听线程池的选择
mina中有两个线程池概念 1.处理监听建立连接的线程池 2.处理读写事件的线程池 本文中主要探讨读写事件的线程池的选择 这两种都经过实际项目的使用和检测,说说优缺点 早期的项目是用Unordere ...
- system.badimageformatexception 未能加载文件或程序集
今天在调用dll文件的时候发现这样一个错误. system.badimageformatexception 未能加载文件或程序集. 发现项目CPU默认Any CPU,我的系统是X64,将 ...
- TCP/IP协议三次握手与四次握手流程解析(转载及总结)
原文地址:http://www.2cto.com/net/201310/251896.html,转载请注明出处: TCP/IP协议三次握手与四次握手流程解析 一.TCP报文格式 TCP/IP协议的详 ...
- ###g++编译器
点击查看Evernote原文. #@author: gr #@date: 2014-07-20 #@email: forgerui@gmail.com 对g++编译器不是特别熟悉,希望借此熟悉一下. ...
- 第十六篇、MBprogressHUD的使用和获取当前的控制器
简介: 在开发应用的时候,为了更好的增加用户的体验,常常在客户端向服务端请求数据的时候,在适当的地方加上非模态HUD,让用户可以可以知道当前的进度,稍作等待. MBProgressHUD 第三方框架G ...
- OC1_类与对象
// // main.m // OC1_类与对象 // // Created by zhangxueming on 15/6/9. // Copyright (c) 2015年 zhangxuemin ...