songge888
2025-01-10 16:34:50
给定一个
如果收到"城市
将原图转换成树。
先用 DFS 预处理出每个点
对于每条错误信息(
这样答案有时候会是负数(实际上是计算的正常的点的数量)。
举个例子:
有
这时候
时间复杂度
#include<bits/stdc++.h>
#define int long long
#define bug cout<<"___songge888___"<<'\n';
using namespace std;
int n,m,q,ans;
struct lyl{
int u,v;
}qu[3000010];
vector<int> g[3000010];
int Size[3000010],fa[3000010];
void dfs(int u){
Size[u]=1;
for(auto v:g[u]){
if(!fa[v]){
fa[v]=u;
dfs(v);
Size[u]+=Size[v];
}
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>qu[i].u>>qu[i].v;
g[qu[i].u].push_back(qu[i].v);
g[qu[i].v].push_back(qu[i].u);
}
fa[1]=-1;
dfs(1);
cin>>q;
while(q--){
ans=0;
int c;
cin>>c;
while(c--){
int op,u,v;
cin>>op;
if(op>0){
u=qu[op].u;
v=qu[op].v;
}
else{
u=qu[-op].v;
v=qu[-op].u;
}
if(fa[u]==v){
ans-=Size[u];
}
if(fa[v]==u){
ans+=Size[v];
}
}
if(ans<0){
ans+=n;
}
cout<<ans<<'\n';
}
return 0;
}