N<=8,显然枚举,时间复杂度O(N!*N*N)。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <iostream>
#include <sstream>using namespace std;const int inf = 1000000000;
bool ga[8][8], gb[8][8];
int idx[8];int main() {int n, ea, eb, ia, ib, da, db;int ans, i, x, y, m, tmp, cas = 1;while (scanf("%d %d %d", &n, &ea, &eb), n || ea || eb) {memset(ga, 0, sizeof(ga));memset(gb, 0, sizeof(gb));scanf("%d %d %d %d", &ia, &ib, &da, &db);for (i = 0; i < ea; i++) {scanf("%d %d", &x, &y);ga[x][y] = ga[y][x] = 1;}for (i = 0; i < eb; i++) {scanf("%d %d", &x, &y);gb[x][y] = gb[y][x] = 1;}m = 1;for (i = 0; i < n; i++) {idx[i] = i;m *= i + 1;}ans = inf;for (i = 0; i < m; i++) {tmp = 0;for (x = 0; x < n; x++) {for (y = x + 1; y < n; y++) {if (ga[x][y] != gb[idx[x]][idx[y]]) {if (ga[x][y]) {tmp += min(da, ib);} else {tmp += min(ia, db);}}}}if (tmp < ans) ans = tmp;next_permutation(idx, idx + n);}printf("Case #%d: %d\n", cas++, ans);}return 0;
}