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 }
更多内容请关注个人微信公众号 物役记 (微信号:materialchains)
作者:雪影蓝枫
本文版权归作者和博客园共有,欢迎转载,未经作者同意须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。