题意:

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

  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. RecyclerView基本用法

    1. 在gradle.build的dependencies中添加RecyclerView需要的包 compile 'com.android.support:cardview-v7:23.4.0'com ...

  2. MySQL 테이블 타입(Heap, MyIsam, InnoDB...) 변경하기

    alter table 을 이용해서 기존의 생성된 테이블의 타입(Heap, MyIsam, InnoDB...)을 변경하는 명령어 입니다. 잠시 까먹은 분은 계실지 몰라도 원래 모르는 ...

  3. android手机震动

    Vibrator是安卓提供的震动器,其没有构造器,通过getSystemService(Context.VIBRATOR_SERVICE)方法获取对象.但使用此类时需要在清单文件中添加访问权限andr ...

  4. 【转】ODBC和OLEDB的连接字符串

    ODBC连接 适合数据库类型 连接方式access  "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pas ...

  5. 常用经典SQL语句大全(基础)

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sqlserver --- 创 ...

  6. ASP.NET Web Service如何工作(3)

    ASP.NET Web Service如何工作(3) [日期:2003-06-26] 来源:CSDN  作者:sunnyzhao(翻译) [字体:大 中 小] 为了使.asmx句柄有可能反串行化SOA ...

  7. OC4_NSString操作

    // // main.m // OC4_NSString操作 // // Created by zhangxueming on 15/6/10. // Copyright (c) 2015年 zhan ...

  8. html元素类型 块级元素、内联元素(又叫行内元素)和内联块级元素。

    html中的标签元素大体被分为三种不同的类型:块级元素.内联元素(又叫行内元素)和内联块级元素. 块级元素特点: 1.每个块级元素都从新的一行开始,并且其后的元素也另起一行.(霸道,一个块级元素独占一 ...

  9. Percona-Server-5.5.15源码安装

    [root@localhost rpm]# ll total 19148 -rw-r--r-- 1 root root   562628 Jan 18  2007 bison-2.3-2.1.x86_ ...

  10. leetcode problem 37 -- Sudoku Solver

    解决数独 Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated ...