Submission #1139405

#TimeUsernameProblemLanguageResultExecution timeMemory
1139405mariacMonthly railway pass (LMIO18_menesinis_bilietas)C++20
100 / 100
665 ms94032 KiB
#include <bits/stdc++.h>

using namespace std;
const int NMAX = 5e5;
int n, m;
vector <pair<int, bool>> graph[NMAX+1];
vector <pair<pair<int, int>, bool>> muchii;
vector <int> componenta(NMAX+1, 0), marime_componenta(NMAX+1, 0), muchii_plecare(NMAX+1, 0);
int id_comp;
map <pair<int , int>, bool> tras;
//bitset <bool> tras[NMAX+1];
void read()
{
    int a, b;
    bool c;
    char ch;
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        cin>>a>>b>>ch;
        if(ch == 'A') c = 1;
        else c = 0;
        graph[a].push_back({b, c});
        graph[b].push_back({a, c});
        muchii.push_back({{a, b}, c});
        muchii.push_back({{b, a}, c});
    }
}
void dfs(int node)
{
    componenta[node] = id_comp;
    marime_componenta[id_comp]++;
    for(auto [next, price]:graph[node])
    {
        if(price==0 && componenta[next] == 0)
            dfs(next);
    }
}
void make_comp()
{
    for(int i=1; i<=n; i++)
    {
        if(componenta[i] == 0)
        {
            id_comp++;
            dfs(i);
        }
    }
}
int rez;
void solve()
{
    for(int i=0; i<muchii.size(); i++)
    {
        int a = muchii[i].first.first;
        int b = muchii[i].first.second;
        a = componenta[a];
        b = componenta[b];
        if(a!=b && !(tras.find({a, b})!=tras.end()) )//tras[a][b] == 0)
        {
            tras[{a, b}] = 1;
            //cout<<"din componenta "<<a<<" in "<<b<<'\n';
            muchii_plecare[a]++;
        }
    }
    for(int i=1; i<=id_comp; i++)
    {
        if(muchii_plecare[i] == id_comp-1)
        {
            rez = rez + marime_componenta[i];
        }
    }
}
void debug()
{
    for(int i=1; i<=n; i++)
    {
        cout<<i<<" "<<componenta[i]<<'\n';
    }
}
int main()
{
    read();
    make_comp();
    solve();
    //debug();
    cout<<rez;
    return 0;
}
/*
nodurile conectate prin trenuri sunt componente conexe
-> graf condensat
verific daca pentru fiecare componenta conexa am bus DIRECT catre oricare alta
*/
#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...