• 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 }
  • 相关阅读:
    IOS调试问题集
    sql常用语句及日期格式
    事件的简单面试题
    首博
    T-SQL查询进阶--详解公用表表达式(CTE)
    c++分布式计算类库
    MSSQL on Linux
    使用supervisor实现.NET Core程序后台运行
    CentOS下安装Nginx并安装服务实现自启动
    macOS安装MongoDB
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6292035.html
Copyright © 2020-2023  润新知