前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >uva 104 Bandwidth

uva 104 Bandwidth

作者头像
若羽
发布2019-07-15 16:47:57
4350
发布2019-07-15 16:47:57
举报
文章被收录于专栏:Code思维奇妙屋

题意:

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

  1)计算每个节点距离相邻节点的最大距离 dis[i]

  2)计算出当前序列中, 所有节点的dis[i], 并求出最大的dis[i] : max_dis

  求最小的max_dis, 并且输出此序列。

  节点数不超过8个

思路:

  节点数不超过八个, 那直接进行全排列, 求解最小值即可。

  复杂度为O(n!)

  坑爹的地方在读图, 模拟读图, 得处理好细节, 全排列的生成直接用dfs即可。

代码:

代码语言:javascript
复制
  1 #include <cmath>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <ctime>
  6 #include <set>
  7 #include <map>
  8 #include <list>
  9 #include <stack>
 10 #include <queue>
 11 #include <string>
 12 #include <vector>
 13 #include <fstream>
 14 #include <iterator>
 15 #include <iostream>
 16 #include <algorithm>
 17 using namespace std;
 18 #define LL long long
 19 #define INF 0x3f3f3f3f
 20 #define MOD 1000000007
 21 #define eps 1e-6
 22 #define MAXN 26
 23 #define MAXM 1000
 24 #define dd {cout<<"debug"<<endl;}
 25 #define pa {system("pause");}
 26 #define p(x) {printf("%d\n", x);}
 27 #define pd(x) {printf("%.7lf\n", x);}
 28 #define k(x) {printf("Case %d: ", ++x);}
 29 #define s(x) {scanf("%d", &x);}
 30 #define sd(x) {scanf("%lf", &x);}
 31 #define mes(x, d) {memset(x, d, sizeof(x));}
 32 #define do(i, x) for(i = 0; i < x; i ++)
 33 #define dod(i, x, l) for(i = x; i >= l; i --)
 34 #define doe(i, x) for(i = 1; i <= x; i ++)
 35 int len, max_ans, n;
 36 char str[MAXM];
 37 vector <int> V[MAXN];
 38 int ans[MAXN];
 39 int order[MAXN];
 40 bool vis[MAXN];
 41 void init()
 42 {
 43     memset(ans, 0, sizeof(ans));
 44     memset(vis, false, sizeof(vis));
 45     memset(order, 0, sizeof(order));
 46     for (int i = 0; i < MAXN; i ++)
 47         V[i].clear();
 48     max_ans = INF;
 49     n = 0;
 50 }
 51 void read()
 52 {
 53     len = strlen(str);
 54     bool flag = false;
 55     char ch;
 56     for (int pos = 0; pos < len; pos ++)
 57     {
 58         if (str[pos] >= 'A' && str[pos] <= 'Z')
 59         {
 60             if (!vis[str[pos] - 'A'])
 61             {
 62                 vis[str[pos] - 'A'] = true;
 63                 n ++;
 64             }
 65             if (!flag)
 66             {
 67                 ch = str[pos];
 68                 flag = true;
 69             }
 70             else
 71             {
 72                 if (find(V[ch - 'A'].begin(), V[ch - 'A'].end(), str[pos] - 'A') == V[ch - 'A'].end())
 73                     V[ch - 'A'].push_back(str[pos] - 'A');
 74                 if (find(V[str[pos] - 'A'].begin(), V[str[pos] - 'A'].end(), ch - 'A') == V[str[pos] - 'A'].end())
 75                     V[str[pos] - 'A'].push_back(ch - 'A');
 76             }
 77         }
 78         else if (str[pos] == ';')
 79         {
 80             flag = false;
 81         }
 82         else if (str[pos] == ':')
 83             continue;
 84     }
 85     memset(vis, false, sizeof(vis));
 86 }
 87 void show()
 88 {
 89     printf("%d\n", n);
 90     for (int i = 0; i < MAXN; i ++)
 91         if (!V[i].empty())
 92         {
 93             printf("%c:", i + 'A');
 94             for (int j = 0; j < V[i].size(); j ++)
 95                 printf(" %c", V[i][j] + 'A');
 96             printf("\n");
 97         }
 98 }
 99 int get_ans()
100 {
101     int max_num = 0;
102     int temp = 0;
103     for (int i = 0; i < MAXN; i ++)
104     {
105         temp = 0;
106         if (ans[i] == 0) continue;
107         for (int j = 0; j < V[i].size(); j ++)
108         {
109             int x  = abs(ans[V[i][j]] - ans[i]);
110             if (x > temp)
111                 temp = x;
112         }
113         max_num = max(max_num, temp);
114     }
115     return max_num;
116 }
117 void dfs(int root, int num)
118 {
119     ans[root] = num;
120     if (num == n)
121     {
122         int x = get_ans();
123         if (x < max_ans)
124         {
125             max_ans = x;
126             for (int i = 0; i < MAXN; i ++)
127                 if (ans[i])
128                     order[ans[i]] = i;
129         }
130         return ;
131     }
132 
133     for (int u = 0; u < MAXN; u ++)
134         if (!vis[u] && !V[u].empty())
135         {
136             vis[u] = true;
137             dfs(u, num + 1);
138             vis[u] = false;
139         }
140 }
141 void solve()
142 {
143     init();
144     read();
145     for (int i = 0; i < MAXN; i ++)
146         if (!V[i].empty())
147         {
148             memset(vis, false, sizeof(vis));
149             memset(ans, 0, sizeof(ans));
150             vis[i] = true;
151             dfs(i, 1);
152         }
153     for (int i = 1; i <= n; i ++)
154         printf("%c ", order[i] + 'A');
155     printf("-> %d\n", max_ans);
156 }
157 
158 int main()
159 {
160     while (gets(str))
161     {
162         if (!strcmp(str, "#")) break;
163         solve();
164     }
165     return 0;
166 }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档