問題の意味
所与のビューのためには、2つの完全項図に分割されます。エッジの数と2つの完全な図である点について。すべてのポイントのための方法の最小要件。
考え
どうやらこのチャート上に接続されたオリジナルの確立の補数は、元は同じグループに滞在することはできませんです。各ブロックの補数ためユニコムの数値は染色されます。
二つのノードが同じ色と補グラフに接続されている場合、明らかに出力-1。
彼らは同じ色に接続されていない場合でも、それは同じグループに配置する必要があります。(あなたが同じグループに入れていない場合は、そこに別の色も、彼らは、ノードを置くためにどこにもありません)
BOOL配列維持\を([I] F \)各色の数を転送することができるカウント、I対は実現可能ではないかもしれない表します。
コード
#include <bits/stdc++.h>
using namespace std;
namespace StandardIO {
template<typename T>inline void read (T &x) {
x=0;T f=1;char c=getchar();
for (; c<'0'||c>'9'; c=getchar()) if (c=='-') f=-1;
for (; c>='0'&&c<='9'; c=getchar()) x=x*10+c-'0';
x*=f;
}
template<typename T>inline void write (T x) {
if (x<0) putchar('-'),x*=-1;
if (x>=10) write(x/10);
putchar(x%10+'0');
}
}
using namespace StandardIO;
namespace Project {
const int N=701;
const int INF=2147483647;
int n,m,ans=INF;
int G[N][N],color[N],size[2],f[N],t[N];
void dfs (int now,int col) {
color[now]=col,++size[col==1];
for (register int i=1; i<=n; ++i) {
if (i==now||G[now][i]) continue;
if (!color[i]) dfs(i,-col);
else if (color[i]==col) {
write(-1);
exit(0);
}
}
}
inline void MAIN () {
read(n),read(m);
for (register int i=1,x,y; i<=m; ++i) {
read(x),read(y);
G[x][y]=G[y][x]=1;
}
f[0]=1;
for (register int i=1; i<=n; ++i) {
if (color[i]) continue;
size[0]=size[1]=0;
dfs(i,1);
memset(t,0,sizeof(t));
for (register int j=0; j<=n; ++j) {
t[j+size[0]]|=f[j];
t[j+size[1]]|=f[j];
}
for (register int j=0; j<=n; ++j) {
f[j]=t[j];
}
}
for (register int i=0; i<=n/2; ++i) {
if (f[i]||f[n-i]) ans=min(ans,i*(i-1)/2+(n-i)*(n-i-1)/2);
}
write(ans);
}
}
int main () {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
Project::MAIN();
}