1488 数据结构实验:连通分量个数

来源:互联网 发布:客户满意率的数据来源 编辑:程序博客网 时间:2024/06/04 19:06

数据结构实验:连通分量个数

#include<iostream>  #include<cstring>  using namespace std;  int pre[1000];  int m,n,u,v;  int find(int x)//查找r的根节点  {      int r=x;              while(pre[r]!=r)//查找r的上一级,就是根节点,并不是r本身          r=pre[r];//就接着找r的上一级      int i=x,j;      while(i!=r)         {          j=pre[i];          pre[i]=r;          i=j;      }      return r;  }  void join(int x,int y)  {      int fx=find(x);//通过find这个函数找到他们的根节点      int fy=find(y);      if(fx!=fy) //如果不是一个上级         pre[fx]=fy; //那么就把fx的根节点设为fy,连通起来两个分支,分支总数少了,需要建立的路也就少了  }  int main()  {      int t;      cin>>t;      while(t--)      {          memset(pre,0,sizeof(pre));          cin>>n>>m;//代表n个顶点和m条边          for(int i=1;i<=n;i++)              pre[i]=i;//每个点都相互独立,每个点的上级都是自己          for(int i=0;i<m;i++)          {              cin>>u>>v;//输入联通的边,建立各点之间的联系              join(u,v);//如果不是          }          int ant=0;          for(int i=1;i<=n;i++)              if(pre[i]==i) //最后开始遍历所有的点,点的上级是他本身的证明没有被联通,需要建路                  ant++;//数量+1          cout<<ant<<endl;      }      return 0;  }
0 0