只做了特殊性质 TFU 的。但是这样如果一个点可能被重复计。求大佬教教后续做法顺便看看哪里有问题吧QAQ
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
struct edge {
int v,w;
};
int c,t,a,b,n,m;
char ch;
char map[100010];
int main()
{
cin>>c>>t;
while(t--) {
cin>>n>>m;
vector<edge> e[100010];
memset(map,0,sizeof(map));
map[n+1]='T',map[n+2]='F',map[n+3]='U';
for(int i=1; i<=m; i++) {
cin>>ch;
if(isupper(ch)) {
cin>>a;
map[a]=ch;
if(ch=='T') e[n+1].push_back({a,0});
else if(ch=='F') e[n+2].push_back({a,0});
else e[n+3].push_back({a,0});
} else {
cin>>a>>b;
if(ch=='+')
e[b].push_back({a,0});
else
e[b].push_back({a,1});
}
} // make map
int res = 0;
queue<vector<edge>> q;
q.push(e[n+3]);
while(!q.empty()) {
vector<edge> s = q.front();
q.pop();
for(edge ed:s) {
res++;
q.push(e[ed.v]);
}
}
// counting of side U
cout<<res<<endl;
}
return 0;
}