题意:
给你一个图(V,E),让你求一个序列,使得这个图中所有节点和与其相连节点的最大距离最小。
思路:
题目中的序列的排布组合方式用next_permutation可全部给出,所以在这些情况中找出符合题目要求的即可。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int ege[30][30],order[10],node[10],mark[30];
char str[100];
int n;
void solve() {
int cnt = 0x3f3f3f3f;
do {
int maxn = 0, temp;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (ege[node[i]][node[j]]) {
temp = j - i;
if (temp > maxn)
maxn = temp;
}
}
}
if (maxn < cnt) {
cnt = maxn;
for (int i = 0; i < n; i++) {
order[i] = node[i];
}
}
} while (next_permutation(node, node + n));
for (int i = 0; i < n; i++) {
printf("%c ", order[i] + 'A');
}
printf("-> %d\n", cnt);
}
int main(){
while (gets(str) && str[0] != '#') {
int len = strlen(str);
memset(ege, 0, sizeof(ege));
memset(order, 0, sizeof(order));
memset(node, 0, sizeof(node));
memset(mark, 0, sizeof(mark));
int u;
for (int i = 0; i < len; i++) {
if (str[i] >= 'A'&&str[i] <= 'Z') {
if (str[i + 1] == ':') {
u = str[i]-'A';
mark[u] = 1;
}
else {
int v = str[i] - 'A';
ege[u][v] = 1;
ege[v][u] = 1;
mark[v] = 1;
}
}
}
n = 0;
for (int i = 0; i < 26; i++) {
if (mark[i])
node[n++] = i;
}
solve();
}
return 0;
}