【PAT甲级】1013 Battle Over Cities (25 分)(并查集,简单联通图)
题意:
输入三个整数N,M,K(N<=1000,第四个数据1e5<=M<=1e6)。有1~N个城市,M条高速公路,K次询问,每次询问输入一个被敌军占领的城市,所有和该城市相连的高速公路全部不能使用,求增加多少条高速公路可以使剩下N-1个城市联通。(原本城市之间可能不联通,假设原本联通只能通过第0,4个数据)。
trick:
同一份代码交很多次,有几次会第4个点超时。(存疑)建议采用g++而不是clang++
AAAAAccepted code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[1000007],b[1000007]; 4 int fa[1007]; 5 int find_(int x){ 6 if(fa[x]==x) 7 return x; 8 else 9 return fa[x]=find_(fa[x]); 10 } 11 int main(){ 12 int n,m,k; 13 cin>>n>>m>>k; 14 for(int i=1;i<=m;++i) 15 cin>>a[i]>>b[i]; 16 for(int i=1;i<=k;++i){ 17 int x; 18 cin>>x; 19 for(int j=1;j<=n;++j) 20 fa[j]=j; 21 for(int j=1;j<=m;++j){ 22 if(a[j]==x||b[j]==x) 23 continue; 24 int t=find_(a[j]); 25 int tt=find_(b[j]); 26 if(t!=tt) 27 fa[t]=tt; 28 } 29 int cnt=-1; 30 for(int j=1;j<=n;++j){ 31 if(j==x) 32 continue; 33 if(fa[j]==j) 34 cnt++; 35 } 36 cout<<cnt<<"\n"; 37 } 38 return 0; 39 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)