【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 }

 

 

 

posted @ 2019-07-25 12:40  sewage  阅读(129)  评论(0编辑  收藏  举报