Uva 140 Bandwidth

Bandwidth 

给你一个以邻接表展现的图的节点以及其相邻的节点,这时你将所有出现过的节点随机排列,找出此排序中相邻节点之间距离最长的值代表此排列的值,而这只是其中一种排列,你要找出所有排列中这种代表的值得最小值,并将有最小值的串的排列情况输出

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=76

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define VALUE 12
 6 #define INF 1000000
 7 using namespace std;
 8 int graph[VALUE][VALUE]; //邻接表存储图 
 9 char input[VALUE*VALUE+10]; //输入 
10 int list[27], store[27]; //list存储所有的节点,store存储当前有最小值的排列 
11 int main()
12 {
13     #ifndef ONLINE_JUDGE
14     freopen("input.txt", "r", stdin);
15     #endif
16     int i, j, t, len, temp, start, point, cnt;
17     int _max, _min;
18     while(scanf("%s", input) != EOF)
19     {
20         if(strcmp(input, "#") == 0) break;
21         memset(list, 0, sizeof(list));
22         memset(graph, 0, sizeof(graph));
23         len = strlen(input);
24         cnt = 0;
25         for(i=0; i<len; ++i)
26         {//处理输入,所有的字符都转换成整型 
27             start = input[i] - 'A';
28             for(t=0; t<cnt && list[t] != start; ++t);
29             if(t >= cnt) list[cnt++] = start;
30             for(i=i+2; input[i] != ';' && i<len; ++i)
31             {
32                 point = input[i] - 'A';
33                 for(t=0; t<cnt && list[t] != point; ++t);
34                 if(t >= cnt) list[cnt++] = point;
35                 graph[start][++graph[start][0]] = point;
36             }
37         }
38         sort(list, list+cnt);
39         _min = INF;
40         do
41         {//每次循环list为不同的排列 
42             _max = -INF;
43             for(i=0; i<cnt; ++i)
44             {
45                 temp = list[i];
46                 for(j=1; j<=graph[temp][0]; ++j)
47                 {
48                     for(t=0; t<cnt && list[t] != graph[temp][j]; ++t);
49                     point = (int)fabs(i-t);
50                     if(_max < point) _max = point;
51                 }
52             }
53             if(_min > _max)
54             {
55                 _min = _max;
56                 memcpy(store, list, sizeof(int)*cnt);
57             }
58             
59         }while(next_permutation(list, list+cnt));
60         for(i=0; i<cnt; ++i)
61         printf("%c ", store[i]+'A');
62         printf("-> %d\n", _min);
63     }
64     return 0;
65 }
原文地址:https://www.cnblogs.com/liaoguifa/p/3050115.html