제출 #3820

#제출 시각아이디문제언어결과실행 시간메모리
3820blmarketCactus? Not cactus? (kriii1_C)C++98
1 / 1
64 ms14200 KiB
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <sstream>
#include <numeric>
#include <iterator>
#include <queue>
#include <set>
#include <map>
#include <vector>

#define mp make_pair
#define pb push_back
#define sqr(x) ((x)*(x))
#define foreach(it,c) for(typeof((c).begin()) it = (c).begin(); it != (c).end(); ++it)

using namespace std;

typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int,int> PII;

template<typename T> int size(const T &a) { return a.size(); } 

int N,M;
VVI links;
int depth[100005];
bool ret = false;

int go(int a, int b, int d) {
    depth[a] = d;
    int cnt = 0;
    int mind = d;
    for(int i=0;i<size(links[a]);i++) {
        int np = links[a][i];
        if(np == b) continue;
        // cout << a << " " << np << " (" << b << ") " << cnt << endl;

        if(depth[np] != -1 && depth[np] < d) {
            mind = depth[np];
            cnt++;
        }

        if(depth[np] != -1) {
            continue;
        }

        int tmp = go(np, a, d+1);
        if(tmp <= d) cnt++;
        mind = min(mind, tmp);
    }

    if(cnt > 1) {
        // cout << a << " " << b << " " << d << endl;
        ret = true;
    }

    return mind;
}

int main(void)
{
    scanf("%d %d", &N, &M);
    links.resize(N+1);
    for(int i=0;i<M;i++) {
        int a,b;
        scanf("%d %d", &a, &b);
        links[a].pb(b);
        links[b].pb(a);
    }

    memset(depth, -1, sizeof(depth));
    go(1, -1, 0);

    if(ret) {
        cout << "Not cactus" << endl;
    } else {
        cout << "Cactus" << endl;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...