제출 #1140934

#제출 시각아이디문제언어결과실행 시간메모리
1140934adelinaMonthly railway pass (LMIO18_menesinis_bilietas)C++20
0 / 100
3095 ms17476 KiB
#include <iostream>
#include <vector>
#include <queue>
#pragma gcc optimize("O4,Ofast")
#pragma gcc optimize("unroll-loops")
using namespace std;

const int Nmax = 5e5 + 5;

vector<int>g[Nmax];
bool mor[Nmax], vis[Nmax];
int parent[Nmax], sz[Nmax], comp[Nmax], par[Nmax];

int findd(int nod)
{
    if(nod == parent[nod])
        return nod;
    return parent[nod] = findd(parent[nod]);
}

void unite(int u, int v)
{
    u = findd(u); v = findd(v);
    if(u == v) return;
    if(sz[v] > sz[u])
        swap(u, v);
    parent[v] = u;
    sz[u] += sz[v];
    sz[v] = 0;
}

int main()
{
    int n, m, a, b, i, c, ans = 0, p = 0;
    char ch;
    cin >> n >> m;
    for(i = 1; i <= n; i ++)
        parent[i] = i, sz[i] = 1;
    for(i = 1; i <= m ; i ++)
    {
        cin >> a >> b >> ch;
        if(ch == 'T')
            unite(a, b);
        else
        {
            g[a].push_back(b);
            g[b].push_back(a);
        }
    }
    for(i = 1; i <= n; i ++)
        par[findd(i)] = 1;
    for(i = 1; i <= n; i ++)
    {
        int parinte = findd(i);
        if(vis[parinte]) continue;
        int cnt = 0;
        for(auto it: g[i])
            mor[findd(it)] = 1;
        //cout << i << ": ";
        for(int j = 1; j <= n; j ++)
            if(mor[j])
                cnt += sz[j], mor[j] = 0;
       // cout << '\n';
        if(cnt + sz[parinte] == n)
            ans += sz[parinte], vis[parinte] = 1;
        //cout << i << " " << parinte << " " << sz[parinte] << " " << cnt << '\n';
    }
    cout << ans;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...