题目描述
给定n(n<=1000)个点的横纵坐标,规定如果两个点x坐标或者y坐标相同,则两个点可以互相通达,现在问,至少添加几条线,能使得从任意一点出发都能到达所有的点...
分析
dfs实现,建图的时候如果两点的x或y相同,那么在两者之间加一条边...最后dfs一下就行--
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #include<cstring> 5 #define N 1010 6 using namespace std; 7 vector<int>V[N]; 8 int x[N],y[N]; 9 bool v[N]; 10 int cnt=0; 11 void dfs(int rt){ 12 if(v[rt])return; 13 v[rt]=1; 14 ++cnt; 15 for(int i=0;i<V[rt].size();i++){ 16 dfs(V[rt][i]); 17 } 18 } 19 int main(){ 20 int n; 21 while(cin>>n){ 22 for(int i=1;i<=n;i++){ 23 V[i].clear(); 24 cin>>x[i]>>y[i]; 25 } 26 int num=n; 27 for(int i=1;i<=n;i++) 28 for(int j=i+1;j<=n;j++){ 29 if(x[i]==x[j]||y[i]==y[j]){ 30 V[i].push_back(j); 31 V[j].push_back(i); 32 } 33 } 34 memset(v,0,sizeof(v)); 35 for(int i=1;i<=n;i++){ 36 cnt=0; 37 dfs(i); 38 if(cnt)num-=(cnt-1); 39 } 40 cout<<num-1<<endl; 41 } 42 return 0; 43 }
浙公网安备 33010602011771号