#include <iostream>
#include <vector>
#include <unordered_map>
#include <set>
using namespace std;
class DSU{
public:
vector<int> parent, size;
DSU(int n){
parent.resize(n+1);
size.resize(n+1,1);
for (int i=1;i<=n;i++){
parent[i]=i;
}
}
int find(int x){
if (parent[x]!=x){
parent[x]=find(parent[x]);
}
return parent[x];
}
void unite(int x, int y){
int rootX=find(x);
int rootY=find(y);
if (rootX!=rootY){
if (size[rootX]>size[rootY]){
parent[rootY]=rootX;
size[rootX]+=size[rootY];
}
else{
parent[rootX]=rootY;
size[rootY]+=size[rootX];
}
}
}
};
int main() {
int n,m,u,v;
char c;
cin>>n>>m;
DSU dsu(n);
vector<pair<int, int>> bus;
for (int i=0;i<m;i++){
cin>>u>>v>>ws>>c;
if (c=='T'){
dsu.unite(u,v);
}
else{
bus.push_back({u,v});
}
}
unordered_map<int, int> train;
for (int i=1;i<=n;i++){
train[dsu.find(i)]++;
}
unordered_map<int, set<int>> graph;
for (auto& b : bus){
int u=b.first, v=b.second;
int rootu=dsu.find(u);
int rootv=dsu.find(v);
if (rootu!=rootv){
graph[rootu].insert(rootv);
graph[rootv].insert(rootu);
}
}
int rez=0;
for (auto& t : train){
size_t visited=graph[t.first].size();
if (visited + 1 == train.size()){
rez+=t.second;
}
}
cout<<rez;
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... |