Submission #156137

#TimeUsernameProblemLanguageResultExecution timeMemory
156137Flying_dragon_02전압 (JOI14_voltage)C++14
45 / 100
429 ms29620 KiB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define pb push_back
#define mp make_pair

typedef pair<int, int> ii;

const int mod = 1e9 + 7;

const int inf = 1e9;

int add(int x, int y) {
    return (1ll * x + 1ll * y) % mod;
}

int del(int x, int y) {
    return ((1ll * x - 1ll * y) % mod + mod) % mod;
}

int mul(int x, int y) {
    return (1ll * x * 1ll * y) % mod;
}

const int N = 1e5 + 5;

int n, m, bad[N], good[N], badEdge, ans, parity[N], dist[N], low[N];

vector<int> graph[N];

bool vis[N];

int cnt;

map<ii, int> mymap;

void dfs(int u, int p) {
    dist[u] = low[u] = ++cnt;
    vis[u] = 1;
    parity[u] = parity[p] ^ 1;
    for(int i = 0; i < graph[u].size(); i++) {
        int v = graph[u][i];
        if(!vis[v]) {
            dfs(v, u);
            bad[u] += bad[v];
            low[u] = min(low[u], low[v]);
        }
        else {
            if(parity[v] == parity[u]) {
                if(dist[v] < dist[u]) {
                    bad[v]--;
                    bad[u]++;
                    badEdge++;
                }
            }
            else {
                if(v == p && mymap[{u, v}] >= 2)
                    low[u] = min(low[u], dist[v]);
                else if(v != p)
                    low[u] = min(low[u], dist[v]);
            }
        }
    }
}

void bfs(int u, int p) {
    vis[u] = 1;
    if(u != 1) {
        if(bad[u] == badEdge && low[u] == dist[u])
            ans++;
    }
    for(int i = 0; i < graph[u].size(); i++) {
        int v = graph[u][i];
        if(v == p) continue;
        if(!vis[v])
            bfs(v, u);
    }
}

int main() {
    cin.tie(0), ios_base::sync_with_stdio(0);
    cin >> n >> m;
    for(int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        graph[u].pb(v);
        mymap[{u, v}]++;
        mymap[{v, u}]++;
        graph[v].pb(u);
    }
    for(int i = 1; i <= n; i++) {
        if(!vis[i])
            dfs(i, i);
    }
    if(badEdge == 1)
        ans++;
    memset(vis, 0, sizeof(vis));
    for(int i = 1; i <= n; i++) {
        if(!vis[i])
            bfs(i, i);
    }
    cout << ans;
}

Compilation message (stderr)

voltage.cpp: In function 'void dfs(int, int)':
voltage.cpp:44:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < graph[u].size(); i++) {
                    ~~^~~~~~~~~~~~~~~~~
voltage.cpp: In function 'void bfs(int, int)':
voltage.cpp:75:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < graph[u].size(); i++) {
                    ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...