枚举每个点为中心点,然后剩下的点需要用圈覆盖,找最大匹配即可
//#pragma GCC optimize("O3")
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
const int MAXN = 555;
int n,m,match[MAXN];
bool mp[MAXN][MAXN],vis[MAXN];
vector<int> G[MAXN];
bool dfs(int u, int c){
vis[u] = true;
for(int v : G[u]){
if(v==c) continue;
if(match[v]==-1 or (!vis[match[v]] and dfs(match[v],c))){
match[v] = u;
return true;
}
}
return false;
}
int hungary(int c){
memset(match,255,sizeof(match));
int mt = 0;
for(int i = 1; i <= n; i++){
if(i==c) continue;
memset(vis,0,sizeof(vis));
if(dfs(i,c)) mt++;
}
return mt;
}
int main(){
____();
cin >> n >> m;
for(int i = 1; i <= m; i++){
int u, v; cin >> u >> v;
G[u].push_back(v);
mp[u][v] = true;
}
int ret = MAXN * MAXN * MAXN;
for(int i = 1; i <= n; i++){
int centeredge = 0;
for(int j = 1; j <= n; j++){
if(i==j and mp[i][j]) centeredge++;
else if(i!=j){
if(mp[i][j]) centeredge++;
if(mp[j][i]) centeredge++;
}
}
int mt = hungary(i);
ret = min(ret,3*n+m-2-2*centeredge-2*mt);
}
cout << ret << endl;
return 0;
}