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;
}