zoukankan      html  css  js  c++  java
  • UVa 140 带宽

    题意:给出一个n个结点的图G和一个结点的排列,定义结点的带宽为i和相邻结点在排列中的最远距离,求出让带宽最小的结点排列。

    思路:用STL的next_permutation来做确实是很方便,适当剪枝一下就可以了,不过我不明白的是为什么我用string字符串会超时...

     1 #include<iostream>
     2 #include<cstring>
     3 #include<string>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int a[30], c[30];
     8 int ans[30];
     9 int map[30][30];
    10 char str[500];
    11 
    12 int main()
    13 {
    14     //freopen("D:\txt.txt", "r", stdin);
    15     int l, k, maxn,n;
    16     while (gets(str) )
    17     {
    18         if (str[0] == '#') break;
    19         memset(map, 0, sizeof(map));
    20         memset(a, 0, sizeof(a));
    21         memset(ans, 0, sizeof(ans));
    22         memset(c, 0, sizeof(c));
    23         l = strlen(str);25         for (int i = 0; i < l; i++)
    26         {
    27             if (str[i] == ':')
    28             {
    29                 int t = str[i - 1] - 'A';
    30                 a[t] = 1;
    31                 for (k = i + 1; str[k] != ';' && k < l; k++)
    32                 {
    33                     int p = str[k] - 'A';
    34                     a[p] = 1;
    35                     map[t][p] = map[p][t] = 1;
    36                 }
    37                 i = k;
    38             }
    39         }
    40 
    41 
    42         n = 0;
    43         for (int i = 0; i < 26; i++)
    44         {
    45             if (a[i])
    46                 c[n++] = i;
    47         }
    48         maxn = 10000;
    49         do
    50         {
    51             int sum = 0;
    52             int ok = 1;
    53             for (int i = 0; i < n; i++)
    54             {
    55                 for (int j = i + 1; j < n; j++)
    56                 {
    57                     if (map[c[i]][c[j]])
    58                     if (j - i>sum)
    59                         sum = j - i;
    60                     if (sum>=maxn)  { ok = 0; break; }
    61                 }
    62                 if (!ok)  break;
    63             }
    64             
    65             if (sum < maxn)
    66             {
    67                 maxn = sum;
    68                 memcpy(ans, c, sizeof(c));
    69             }
    70         } while (next_permutation(c, c + n));
    71         for (int i = 0; i < n; i++)
    72         {
    73             char s = 'A' + ans[i];
    74             cout << s << " ";
    75         }
    76         cout << "-> " << maxn << endl;
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    秒杀多线程第十篇 生产者消费者问题 (续)
    平面最近点距离问题(分治法)
    阿里神马搜索算法实习生 二面
    37. Sudoku Solver
    52. N-Queens II(数个数)
    51. N-Queens
    89. Gray Code(公式题)
    22. Generate Parentheses(回溯)
    回溯总结
    40. Combination Sum II
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6292035.html
Copyright © 2011-2022 走看看