題解 P1197 【[JSOI2008]星球大戰】
阿新 • • 發佈:2020-07-17
連結戳這裡☞
#include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; int mp[400001][3]; vector<int> q; vector<int> edge[400005]; int m,n,z,res; bool vis[400001]; int x[400001],kill[400001],ans[400001]; bool judge(int v) { for(int i=q.size()-1;i>=0;--i) { if(q[i]==v) return false; } return true; } void init(); int father(int v) { int i,j=v; while(v!=x[v]) { v=x[v]; } while(j!=x[j]) { i=j; j=x[j]; x[i]=v; } return v; } /*int father(int v) { return x[v]=v ? v:(x[v]=father(x[v])); }*/ int main() { init(); for(int i=z;i>=1;--i) { } } void init() { memset(vis,true,sizeof(vis)); scanf("%d%d",&n,&m); for(int i=0;i<n;++i) { x[i]=i; } for(int i=1;i<=m;++i) { scanf("%d%d",&mp[i][1],&mp[i][2]); edge[mp[i][1]].push_back(mp[i][2]); edge[mp[i][2]].push_back(mp[i][1]); } scanf("%d",&z); for(int i=1;i<=z;++i) { scanf("%d",&kill[i]); vis[kill[i]]=false; } res=n-z; for(int i=1;i<=m;++i) { if(vis[mp[i][1]]&&vis[mp[i][2]]) { if(father(mp[i][1])!=father(mp[i][2])) res--; x[father(mp[i][1])]=father(mp[i][2]); } } ans[z]=res; // printf("\n\n%d\n\n",res); for(int i=z;i>=1;--i) { for(int j=0;j<edge[kill[i]].size();++j) { if(vis[edge[kill[i]][j]]&&father(edge[kill[i]][j])!=father(kill[i])) { //q.push_back(edge[kill[i]][j]); res--; x[father(kill[i])]=father(edge[kill[i]][j]);//☣ } } //q.clear(); vis[kill[i]]=true; res=res+1; ans[i-1]=res; } for(int i=0;i<=z;++i) { printf("%d\n",ans[i]); } //printf("\n\n%d",res); //res=n-z; } 經典並查集題目,建議初學者可以來練手!!!