uva140 Bandwidth

https://vjudge.net/problem/UVA-140

给出一个图,构造一个排列,使图上相邻节点在排列中的距离最大值最小

没有剪枝,竟然10ms过了,~~~

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool b[26][26],use[10];
char s[100],ans[10],tmp[26];
int len,v[26],num,minn,now[10],pos[10];
void cal()
{
    int k=0;
    for(int i=1;i<=num;i++)
     for(int j=1;j<=num;j++)
      if(b[i][j])  k=max(k,abs(pos[i]-pos[j]));
    if(k<minn)
    {
        for(int i=1;i<=num;i++) ans[i]=tmp[now[i]];
        minn=k;
    }
}
void dfs(int cnt)
{
    if(cnt==num+1) { cal(); return; }
    for(int i=1;i<=num;i++)
    {
        if(!use[i])
        {
            now[cnt]=i; use[i]=true; pos[i]=cnt;
            dfs(cnt+1);
            use[i]=false;
        }
    }
}
void pre()
{
    memset(b,0,sizeof(b));
    memset(use,0,sizeof(use));
    memset(v,0,sizeof(v));
    minn=10;
    num=0;
}
int main()
{
    while(scanf("%s",s)!=EOF)
    {
        if(s[0]==‘#‘) return 0;
        pre();
        char x;
        len=strlen(s);
        for(int i=0;i<len;i++) v[s[i]-‘A‘]=30;
        for(int i=0;i<26;i++)
         if(v[i]==30) v[i]=++num,tmp[num]=i+‘A‘;
        for(int i=0;i<len;i++)
            if(s[i+1]==‘:‘) x=s[i];
             else if(s[i]>=‘A‘ && s[i]<=‘Z‘)  b[v[x-‘A‘]][v[s[i]-‘A‘]]=b[v[s[i]-‘A‘]][v[x-‘A‘]]=true;
        dfs(1);
        for(int i=1;i<=num;i++) printf("%c ",ans[i]);
        printf("-> %d\n",minn);
    }
}
时间: 2024-10-17 18:06:15

uva140 Bandwidth的相关文章

UVa140 Bandwidth 小剪枝+双射小技巧+枚举全排列+字符串的小处理

给出一个图,找出其中的最小带宽的排列.具体要求见传送门:UVa140 这题有些小技巧可以简化代码的编写. 本题的实现参考了刘汝佳老师的源码,的确给了我许多启发,感谢刘老师. 思路: 建立双射关系:从字符A到字符Z遍历输入的字符串,用strchr函数将输入中出现的字符找出,并将找出的字符进行编号,用letter和id分别存储字符和对应的编号 降维:输入中给出的,是类似于邻接表形式的二维形式,如果我们用二维数据结构,将增加处理时对于输出细节的处理难度,用 2个 vector将输出降低到1维,简化了计

Uva140 Bandwidth 全排列+生成测试法+剪枝

参考过仰望高端玩家的小清新的代码... 思路:1.按字典序对输入的字符串抽取字符,id[字母]=编号,id[编号]=字母,形成双射       2.邻接表用两个vector存储,存储相邻关系       3.先尝试字母编号字典序最小的排列,此为next_permutation的最上排列       4.在最理想的情况下都不能得到比当前最优解更好的方案,则应当剪枝(prune)       5.memcpy(),strchr()方法来自于库函数 测试集: Input:      A:FB;B:GC

UVa140 Bandwidth (枚举排列)

链接:http://acm.hust.edu.cn/vjudge/problem/19399分析:将结点字母用数字0~n-1表示,id[ch]将字符映射到对应的数字编号,letter将数字编号映射到对应的字符,用两个vector将每个结点的相邻结点编号存下来,然后枚举0~n-1位置上的结点编号,用pos记录每个结点编号所在的位置方便以后查找,然后就是遍历vector,第一个vector代表结点编号i,第二个vector代表结点i的相邻结点编号,找出最远距离,如果当前找到的最远距离已经大于或等于a

UVa-140 - Bandwidth

决定跳过数据结构那章,来看暴力求解法.暴力这章之前也看过,可是前几天做了一道POJ的暴力题,却没有想起来自己曾经在书上看过类似的暴力枚举解法,所以决定再仔细看一遍.感觉要是不刷题,只是单纯的看书的话,记不住啊. 书中也说了,可以剪枝(“发现两个结点的距离大于或等于k”,“如果在搜索到结点u时,u结点还有m个相邻点没有确定位置”),不过这只能跳过当前排列而已,对减少时间复杂度的意义不是太大,所以我就还是贴上自己原本的代码. 前几天买了侯捷的<STL源码剖析>,最近在研究STL,真好用,比如这个题

UVA-140 Bandwidth (回溯+剪枝)

题目大意:求一个使带宽最小的排列和最小带宽.带宽是指一个字母到其相邻字母的距离最大值. 题目分析:在递归生成全排列的过程中剪枝,剪枝方案还是两个.一.当前解不如最优解优时,减去:二.预测的理想解不必最优解优时,减去.将与当前最后一个位置上的字母相邻的字母全部接过来,便得理想解. 代码如下: # include<iostream> # include<cstdio> # include<string> # include<vector> # include&l

light oj 1153 - Internet Bandwidth【网络流无向图】

1153 - Internet Bandwidth   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB On the Internet, machines (nodes) are richly interconnected, and many paths may exist between a given pair of nodes. The total message-carrying cap

UVA820 Internet Bandwidth

很裸的模版题,就是敲起来稍微麻烦一点. #include<bits/stdc++.h> using namespace std; struct Edge { int v,cap; }; const int maxn = 101; vector<Edge> E; vector<int> G[maxn]; #define PB push_back void AddEdge(int u,int v,int c) { G[u].PB(E.size()); E.PB({v,c})

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 connected in th

【转】什么是对分带宽/对半带宽 (bisection bandwidth)

转自 http://blog.sina.com.cn/s/blog_8333a3030101dh2p.html 1. 定义: 用一截面将网络划分成对等的两半时(或者两个结点数目都相同的子网)时,穿过该截面的最大传输率. 对分带宽越大,网络的通信能力越强. 2. 计算: 如果每条链路的带宽都已知道的情况下,则以链路带宽计算.否则,假设链路带宽为1. 下面的计算都是假设链路带宽为1. 1) n个结点的全连接网络(Fully interconnected network): 每个子网的结点数目为n/2