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

题意:给定图,求是带宽最小的结点排列。

分析:结点数最多为8,全排列即可。顶点范围是A~Z。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
typedef long long ll;
typedef unsigned long long llu;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-8;
const int MAXN = 100 + 10;
const int MAXT = 10000 + 10;
using namespace std;
char s[MAXN];
set<int> node[30];
vector<int> v;
int t[10];
void init(){
    for(int i = 0; i < 30; ++i){
        node[i].clear();
    }
    v.clear();
    memset(t, 0, sizeof t);
    int len = strlen(s);
    for(int i = 0; i < len; ++i){
        if(s[i] == ‘:‘){
            int tmp = s[i - 1] - ‘A‘;
            while(1){
                ++i;
                if(i == len) break;
                if(s[i] == ‘;‘) break;
                node[tmp].insert(s[i] - ‘A‘);
                node[s[i] - ‘A‘].insert(tmp);
            }
        }
    }
}
int main(){
    while(scanf("%s", s) == 1){
        if(s[0] == ‘#‘) return 0;
        init();
        for(int i = 0; i < 30; ++i){
            if(node[i].size()){
                v.push_back(i);
            }
        }
        int len = v.size();
        int ans = INT_M_INF;
        do{
            int tmp = 0;
            for(int i = 0; i < len; ++i){
                for(int j = 0; j < i; ++j){
                    if(node[v[i]].count(v[j])){
                        tmp = max(tmp, i - j);
                    }
                }
            }
            if(tmp < ans){
                ans = tmp;
                for(int i = 0; i < len; ++i){
                    t[i] = v[i];
                }
            }
        }while(next_permutation(v.begin(), v.end()));
        for(int i = 0; i < len; ++i){
            printf("%c ", ‘A‘ + t[i]);
        }
        printf("-> %d\n", ans);
    }
    return 0;
}
时间: 2024-11-09 09:36:46

UVA - 140 Bandwidth(带宽)(全排列)的相关文章

uva 140 Bandwidth (全排列+暴力枚举)

uva 140 Bandwidth Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the elements in V, then the bandwidth of a node v is defined as the maximum distance in the ordering between v and any node to which it

[2016-02-20][UVA][140][Bandwidth]

UVA - 140 Bandwidth Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the elements in V, then the bandwidth 

uva 140 Bandwidth(全排列+递归)

快睡觉的时候1A的把序列全排列,递归暴力判断就ok啦,我改成对应的整数存了,a数组存的是所有的字符的排列, b数组存的是所有开始节点的排列,map[i][j]数组存的是i为起点,与j相邻 贴代码: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> #include<math.h> #include<algorithm> using na

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 ordering on the elements in V, then the bandwidth of a node v is defined as the maximum distance in the ordering between v and any node to which it is con

UVa 140 Bandwidth(DFS 回溯 剪枝)

题意  有一个无向图  对于其所有顶点的一个排列 称一顶点与所有与其有边的其它顶点在排列中下标差的最大值为这个顶点的带宽   而所有顶点带宽的最大值为这个排列的带宽   求这个图带宽最小的排列 枚举排列  ans记录当前找到的最小带宽  枚举过程中一旦出现带宽大于ans的也就不用再扩展了  这样枚举完就得到了答案 #include<cstdio> #include<cstring> using namespace std; const int N = 50; int n, ans,

UVa 140 带宽

题意:参考之前讲回溯法的最后一个问题. 思路:枚举全排列,考察每一种排列下的结果.  也可以进行剪枝优化,也是参见之前讲回溯法的部分. 这里我是用二维数组g来存边关系,但顶点还是单独保存在一个数组里,然后排序,然后求排列. 这题居然交了9次,1CE1TLE1AC6WA,CE的原因是没有包含cstring,在本地没包含可以...TLE原因是没有注释掉freopen.WA的原因之前一直以为是输出有问题,因为找了很多数据都通过了,以及题目说最多8个结点,但是图还是要开26X26啊...一次一次修改,虽

UVa 140 (枚举排列) Bandwidth

题意较复杂,请参见原题=_=|| 没什么好说的,直接枚举每个排列就好了,然后记录最小带宽,以及对应的最佳排列. STL里的next_permutation函数真是好用. 比较蛋疼的就是题目的输入了.. 还有就是不明白,为什么19.20行注释哪错了?? 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 10; 5 6 int id[256], letter[maxn]; 7 char in[1000];

uva 104 Bandwidth

题意: 给一个图, 将其节点以任一序列排列. 1)计算每个节点距离相邻节点的最大距离 dis[i] 2)计算出当前序列中, 所有节点的dis[i], 并求出最大的dis[i] : max_dis 求最小的max_dis, 并且输出此序列. 节点数不超过8个 思路: 节点数不超过八个, 那直接进行全排列, 求解最小值即可. 复杂度为O(n!) 坑爹的地方在读图, 模拟读图, 得处理好细节, 全排列的生成直接用dfs即可. 代码: 1 #include <cmath> 2 #include <

uva 10098 Generating Fast(全排列)

还是用的两种方法,递归和STL,递归那个是含有反复元素的全排列,这道题我 没有尝试没有反复元素的排列,由于从题目上并没有发现一定是有反复元素的() 贴代码: <span style="font-family:Courier New;font-size:18px;">#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using