1013 Battle Over Cities - 並查集
阿新 • • 發佈:2018-11-09
思路:
簡單並查集,就是我們不考慮一個城市的時候,可以排除它用並查集,看看最後有幾堆,那麼ans就是堆數-1,(要把這幾堆連起來)
犯傻的地方:
(1)qwq我開始看題還在想,用並查集怎麼把取消的那個城市相關操作取消掉qwq,我是個傻子嗎???離線處理不就好了qwq
(2)求堆數的時候還開了個vis陣列,標記每個城市的父節點???若這個點沒被標記,則ans++???
直接看看有幾個點他的父節點就是自己不就知道有幾堆了嘛qwq
程式碼如下:
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<queue> #include<cmath> #include<set> #include<map> #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; const int N=1010; int n,m,a[N*N],b[N*N],pre[N]; int f(int x){ if(pre[x]==x)return x; pre[x]=f(pre[x]); return pre[x]; } void link(int x,int y){ int r1=f(x),r2=f(y); if(r1!=r2){ pre[r2]=r1; } } void solve(int city){ for(int i=1;i<=n;i++){ pre[i]=i; } for(int i=0;i<m;i++){ if(a[i]==city||b[i]==city)continue; link(a[i],b[i]); } int ans=0; for(int i=1;i<=n;i++){ if(i==city)continue; int ri=f(i); if(ri==i)ans++; } printf("%d\n",ans-1); } int main(){ int k; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;i++){ scanf("%d%d",&a[i],&b[i]); } int x; for(int i=1;i<=k;i++){ scanf("%d",&x); solve(x); } }