北京網(wǎng)站制作公司建站體驗(yàn)營(yíng)銷理論
【洛谷】AT_abc371_c [ABC371C] Make Isomorphic 的題解
洛谷傳送門
AT傳送門
題解
抽象題目,抽象翻譯,可能是我太菜了,根本沒看懂題目,后面是聽大佬講題才發(fā)現(xiàn),這不就是一題全排列暴力題嗎。諤諤,真的我諤諤!!!怪不得評(píng)橙!!???!!!
首先先看題目意思:
給定簡(jiǎn)單無(wú)向圖 G G G, H H H ,每個(gè)圖都有 N N N 個(gè)頂點(diǎn)。 G G G 有 M M M 條邊; H H H 有 M M M 條邊。
-
若 H H H 中 i i i 與 j j j 間無(wú)邊,則添加邊;
-
若 H H H 中 i i i 與 j j j 間有邊,則刪除邊。
求使 G G G 和 H H H 同構(gòu)的最小總成本。
題目非常的抽象,剛開始在研究半天同構(gòu)到底是什么意思qaq
題目數(shù)據(jù)范圍很小,只有 $ n \le 8$。所以直接暴力全排列取出最小值即可。時(shí)間復(fù)雜度 O ( n ! ) O(n!) O(n!)。腦抽想了快一個(gè)小時(shí),還是大佬教的代碼
代碼
#include <bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {inline int read() {register int x = 0, f = 1;register char c = getchar();while (c < '0' || c > '9') {if(c == '-') f = -1;c = getchar();}while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;}inline void write(int x) {if(x < 0) putchar('-'), x = -x;if(x > 9) write(x / 10);putchar(x % 10 + '0');return;}
}
using namespace fastIO;
int n, m1, m2, G[15][15], H[15][15], edge[15][15], p[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
ll ans = 0x3f3f3f3f3f3f;
int main() {//freopen(".in","r",stdin);//freopen(".out","w",stdout);n = read(), m1 = read();for(int i = 1; i <= m1; i ++) {int u, v;u = read(), v = read();G[u][v] = G[v][u] = 1;}m2 = read();for(int i = 1; i <= m2; i ++) {int u, v;u = read(), v = read();H[u][v] = H[v][u] = 1;}for(int i = 1; i < n; i ++) {for(int j = i + 1; j <= n; j ++) {edge[i][j] = read();}}do {ll temp = 0;for(int i = 1; i <= n; i ++) {for(int j = 1; j <= n; j ++) {if(i != j) {temp += edge[i][j] * (G[p[i]][p[j]] != H[i][j]);} } }ans = min(ans, temp);} while(next_permutation(p + 1, p + n + 1));cout << ans << endl;return 0;
}