Submission #1254180

#TimeUsernameProblemLanguageResultExecution timeMemory
1254180gramathegodMonthly railway pass (LMIO18_menesinis_bilietas)C++20
16 / 100
551 ms104712 KiB
#include <bits/stdc++.h>

using namespace std;

const int N=5e5+5;

vector<int> buses[N];

vector<int> trains[N];

set<int> adj[N];

int cnt, vis[N], parent[N], sz[N];

void checkconnect(int i){
    vis[i]=1;
    cnt++;
    for (auto x: buses[i]){
        if (!vis[x]){
            checkconnect(x);
        }
    }
    for (auto x: trains[i]){
        if (!vis[x]){
            checkconnect(x);
        }
    }
}

void dfs(int i, int p){
    vis[i]=1;
    parent[i]=p;
    sz[p]++;
    for (auto x: trains[i]){
        if (!vis[x]){
            dfs(x, p);
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m;cin>>n>>m;
    for (int i=0;i<m;i++){
        int u,v;
        char c;
        cin>>u>>v>>c;
        if (c=='A'){
            //bus
            buses[u].push_back(v);
            buses[v].push_back(u);
        }
        else if (c=='T'){
            //train
            trains[u].push_back(v);
            trains[v].push_back(u);
        }
    }
    checkconnect(1);
    if (cnt!=n){
        cout<<0;
        return 0;
    }
    memset(vis, 0, sizeof(vis));
    int k=1;
    for (int i=1;i<=n;i++){
        if (!vis[i]){
            dfs(i, k);
            k++;
        }
    }
    for (int i=1;i<=n;i++){
        for (auto x:buses[i]){
            adj[parent[i]].insert(parent[x]);
            adj[parent[x]].insert(parent[i]);
        }
    }
    k--;
    int ans=0;
    for (int i=1;i<=k;i++){
        if ((int)adj[i].size()==k-1){
            ans+=sz[i];
        }
    }
    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...