趋势了……输出全0
查看原帖
趋势了……输出全0
551204
Nahida1118楼主2024/12/23 20:15

C++17

O2O2

#include <iostream>
#include <algorithm>
#include <array>
#include <cstdlib>
#include <vector>
using namespace std;

static const int SIZE = 100005;

template<int size>
class DFSType
{
    array<int, size> c;
    array<int, 3> cnt;
    array<vector<int>, size> *g;
    bool flag;
    void dfs(int u);
public:
    DFSType(array<vector<int>, size> &g);
    int operator() (int u);
};

template<int size>
DFSType<size>::DFSType(array<vector<int>, size> &g)
{
    this->g = &g;
    flag = false;
    cnt[1] = 1;
    cnt[2] = 0;
}

template<int size>
void DFSType<size>::dfs(int u)
{
    for(int j=0; j<(*g)[u].size(); ++j)
    {
        int v = (*g)[u][j];
        if(!c[v])
        {
            c[v] = 3-c[u];
            ++cnt[c[v]];
            dfs(v);
        }
        else if(c[u] == c[v])
        {
            flag = true;
        }
        else
        {
            continue;
        }
    }
}

template<int size>
int DFSType<size>::operator() (int u)
{
    if(c[u])
    {
        c[u] = 1;
        dfs(u);
        if(flag)
        {
            return min(cnt[1], cnt[2]);
        }
        return -1;
    }
    return -2;
}

int main()
{
    int n, m, ans = 0;
    bool flag = true;
    array<vector<int>, SIZE> g;
    cin >> n >> m;
    for(int i=1; i<=m; ++i)
    {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    DFSType<SIZE> dfs(g);
    for(int i=1; i<=n; ++i)
    {
        int x = dfs(i);
        if(x == -2)
        {
            continue;
        }
        if(x == -1)
        {
            flag = false;
            break;
        }
        ans += x;
    }
    if(flag)
    {
        cout << ans << endl;
    }
    else
    {
        cout << "Impossible" << endl;
    }
    return EXIT_SUCCESS;
}
2024/12/23 20:15
加载中...