这个是我的赛时做法,感觉和std没有逻辑上的区别,就是存边改成了map而已
而且hand的数据都A了,random的第二个就开始出错
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
vector<int>e[300001];
map<pair<int,int>,bool>k;
struct edges{
int u;int v;
}ed[300001];
int fa[300001];
int find(int x){
if(x==fa[x])return x;
fa[x]=find(fa[x]);
return fa[x];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
fa[i]=i;
}
for(int i=1;i<=m;i++){
cin>>ed[i].u>>ed[i].v;
e[ed[i].u].push_back(ed[i].v);
e[ed[i].v].push_back(ed[i].u);
k[make_pair(ed[i].u,ed[i].v)]=1;
k[make_pair(ed[i].v,ed[i].u)]=1;
}
int Q;
cin>>Q;
ans=m;
while(Q--){
int b;
cin>>b;
int x=ed[b].u,y=ed[b].v;
int fax=find(x),fay=find(y);
if(fax==fay){
cout<<ans<<'\n';
continue;
}
bool clsf[400010];
memset(clsf,0,sizeof clsf);
if(e[fax].size()<e[fay].size())swap(fax,fay);
fa[fay]=fax;
for(int i:e[fay]){
int mi=find(i);
if(clsf[mi]==0&&(k[make_pair(fax,mi)]||mi==fax)){
clsf[mi]=1;
ans--;
// cout<<fax<<' '<<i<<'\n';
}else{
k[make_pair(fax,mi)]=k[make_pair(mi,fax)]=1;
e[fax].push_back(mi);
}
}
cout<<ans<<'\n';
}
return 0;
}