dreamxr
精诚所至,金石为开!

导航

 

题目描述

  给定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 }
posted on 2012-09-07 19:58  dreamxr  阅读(114)  评论(0)    收藏  举报