#include <iostream>
#include <vector>
#include <set>
using namespace std;
const int NMAX = 5e5 + 1;
int n, m;
int cnt, nr;
struct bus
{
int a, b, tip;
};
bus v[NMAX];
bool viz[NMAX];
int M[NMAX],x[NMAX];
vector<vector<int>>G(NMAX);
vector<set<int>>C(NMAX);
void Read()
{
int a, b;
char ch;
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
cin >> a >> b;
cin >> ch;
if(ch == 'A')
{
v[++cnt].a = a;
v[cnt].b = b;
}
else
{
G[a].push_back(b);
G[b].push_back(a);
}
}
}
void dfs(int idx, int mark)
{
x[nr]++;
viz[idx] = 1;
M[idx] = mark;
for(auto x : G[idx])
if(viz[x] == 0)
dfs(x, mark);
}
void compute_conex_elements()
{
for(int i = 1; i <= n; i++)
if(viz[i] == 0)
dfs(i, ++nr);
}
void create_C()
{
for(int i = 1; i <= cnt; i++)
{
int a = v[i].a,
b = v[i].b;
if(M[a] != M[b])
{
C[M[a]].insert(M[b]);
C[M[b]].insert(M[a]);
}
}
}
void answer()
{
int sol = 0;
for(int i = 1; i <= nr; i++)
{
if(C[i].size() == nr - 1)
sol+=x[i];
}
cout << sol;
}
int main()
{
Read();
compute_conex_elements();
create_C();
answer();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |