程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> uva 140 Bandwidth (全排列+暴力枚舉)

uva 140 Bandwidth (全排列+暴力枚舉)

編輯:關於C++

uva 140 Bandwidth


Given a graph (V,E) where V is a set of nodes and E is a set of arcs in VxV, and an ordering on the elements in V, then the bandwidth of a node v is defined as the maximum distance in the ordering between v and any node to which it is connected in the graph. The bandwidth of the ordering is then defined as the maximum of the individual bandwidths. For example, consider the following graph:

picture25

This can be ordered in many ways, two of which are illustrated below:

picture47

For these orderings, the bandwidths of the nodes (in order) are 6, 6, 1, 4, 1, 1, 6, 6 giving an ordering bandwidth of 6, and 5, 3, 1, 4, 3, 5, 1, 4 giving an ordering bandwidth of 5.

Write a program that will find the ordering of a graph that minimises the bandwidth.

Input

Input will consist of a series of graphs. Each graph will appear on a line by itself. The entire file will be terminated by a line consisting of a single #. For each graph, the input will consist of a series of records separated by `;'. Each record will consist of a node name (a single upper case character in the the range `A' to `Z'), followed by a `:' and at least one of its neighbours. The graph will contain no more than 8 nodes.

Output

Output will consist of one line for each graph, listing the ordering of the nodes followed by an arrow (->) and the bandwidth for that ordering. All items must be separated from their neighbours by exactly one space. If more than one ordering produces the same bandwidth, then choose the smallest in lexicographic ordering, that is the one that would appear first in an alphabetic listing.

Sample input

A:FB;B:GC;D:GC;F:AGH;E:HD
#

Sample output

A B C F G D H E -> 3


題目大意:給出一些點,以及所有必須相連的兩點,然後每個排序中,找出必須連接的距離最大值,然後在所有序列中找出連接所需最短的。

解題思路:先將節點關系構成一張表,然後根據表進行全排列進行枚舉(利用next_permutation函數),找出最小帶寬。


#include
#include
#include
#include
using namespace std;
char ch[10], ch2[10];
int A[30][30], Max, Min, a[26];
int find(char a) {
	for (int i = 0; i < 10; i++) {
		if (ch[i] == a) return i;
	}
}
void getMin() { //找出給排列情況的帶寬
	int temp1, temp2, num;
	for (int i = 0; i < 26; i++) {
		for (int j = 0; j < 26; j++) {
			if (A[i][j]) {
				temp1 = find(i + 'A');	
				temp2 = find(j + 'A');
				num = abs(temp1 - temp2);
				if (Max < num) {
					Max = num;
				}
			}
		}
	}
}
int main() {
	char str[100];
	while (scanf("%s", str) == 1 && strcmp(str, "#") != 0) {
		memset(A, 0, sizeof(A));
		memset(a, 0, sizeof(a));
		int len = strlen(str);
		int cnt1, cnt2 = 0, flag = 1;
		for (int i = 0; i < len; i++) { //構成一張關系表
			if (str[i] >= 'A' && str[i] <= 'Z') {
				a[str[i] - 'A']++;
				if (flag) {
					cnt1 = str[i] - 'A';
				}
				else {
					A[cnt1][str[i] - 'A'] = 1;
				}
			}
			else if (str[i] == ':') flag = 0;
			else if (str[i] == ';') flag = 1;
		}
		memset(ch, 0, sizeof(ch));
		memset(ch2, 0, sizeof(ch2));
		for (int i = 0; i < 26; i++) {//找出出現過的節點字母編號
			if (a[i] != 0) ch[cnt2++] = i + 'A';
		}
		Min = 10;
		sort(ch, ch + strlen(ch));//排序,為全排列做准備
		do{                         //全排列找出最小帶寬
			Max = 0;
			getMin();
			if (Min > Max) {
				strcpy(ch2, ch);
				Min = Max;
			}
		}
		while (next_permutation(ch, ch + strlen(ch)));
		for (int i = 0; i < strlen(ch2); i++) {
			printf("%c ", ch2[i]);
		}
		printf("-> %d\n", Min);
	}	
	return 0;
}





  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved