您的位置:首页 > 其它

Uva 140 - Bandwidth

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

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

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define VALUE 12
#define INF 1000000
using namespace std;
int graph[VALUE][VALUE]; //邻接表存储图
char input[VALUE*VALUE+10]; //输入
int list[27], store[27]; //list存储所有的节点,store存储当前有最小值的排列
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int i, j, t, len, temp, start, point, cnt;
int _max, _min;
while(scanf("%s", input) != EOF)
{
if(strcmp(input, "#") == 0) break;
memset(list, 0, sizeof(list));
memset(graph, 0, sizeof(graph));
len = strlen(input);
cnt = 0;
for(i=0; i<len; ++i)
{//处理输入,所有的字符都转换成整型
start = input[i] - 'A';
for(t=0; t<cnt && list[t] != start; ++t);
if(t >= cnt) list[cnt++] = start;
for(i=i+2; input[i] != ';' && i<len; ++i)
{
point = input[i] - 'A';
for(t=0; t<cnt && list[t] != point; ++t);
if(t >= cnt) list[cnt++] = point;
graph[start][++graph[start][0]] = point;
}
}
sort(list, list+cnt);
_min = INF;
do
{//每次循环list为不同的排列
_max = -INF;
for(i=0; i<cnt; ++i)
{
temp = list[i];
for(j=1; j<=graph[temp][0]; ++j)
{
for(t=0; t<cnt && list[t] != graph[temp][j]; ++t);
point = (int)fabs(i-t);
if(_max < point) _max = point;
}
}
if(_min > _max)
{
_min = _max;
memcpy(store, list, sizeof(int)*cnt);
}

}while(next_permutation(list, list+cnt));
for(i=0; i<cnt; ++i)
printf("%c ", store[i]+'A');
printf("-> %d\n", _min);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: