prettify

2016年5月6日金曜日

"派閥" AtCoder Beginner Contest 002 D

派閥

解法
知り合い関係をbool g[12][12]で記録(n番とm番が知り合いならg[n][m] = g[m][n] = true)。
それぞれの議員について、以下のように「その議員を入れた派閥で最大のものの人数」を求めていく。
派閥をvectorで表して、
1. まず議員を一人vに入れる(この人を含めた派閥で最大のものを考える)。
2. まだチェックしていない議員について、派閥全員と知り合いならその人を派閥に入れる。
3. 2を繰り返す。
各議員についてこれを繰り返して、vが一番長かったときの長さを答えとしています。
計算量はN^2。

// ABC002 D
#include <bits/stdc++.h>
#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
using namespace std;
bool g[12][12];

int main(){
    int N, M;
    cin >> N >> M;
    REP(i,M){
        int x, y;
        cin >> x >> y;
        x--; y--;
        g[x][y] = true; g[y][x] = true;}

    int ans = 0;
    REP(i,N){
        vector v;
        v.push_back(i);
        REP(j,N){
            int l = v.size();
            int c = 0;
            for(int i = 0; i < v.size(); i++) {
                if(g[v[i]][j]) c++;}
            if(c == l){
                v.push_back(j);}}
        if(ans < v.size()) ans = v.size();}
    cout << ans << endl;
    return 0;
}

0 件のコメント:

コメントを投稿