スマーフ要求「NOIP以上の2019の学校の入学試験。」

問題の意味

所与のビューのためには、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();
}

おすすめ

転載: www.cnblogs.com/ilverene/p/11620107.html