现在的位置: 首页 > 综合 > 正文

并查集 & 路径压缩

2013年12月10日 ⁄ 综合 ⁄ 共 617字 ⁄ 字号 评论关闭

#include<iostream>
#include<vector>
using namespace std;
vector<int>ve;
int find(int v){
   if(v==ve[v])return v;//路径压缩
  else return ve[v]=find(ve[v]);
 
  while(v!=ve[v]){
    v=ve[v];
  }return v;
}
void unionset(int v1,int v2){
  int u=find(v1);
  int v=find(v2);
  if(u!=v){
    if(u>v)ve[u]=v;
    else ve[v]=u;
  }
}

int main(int argc, char *argv[])
{
  int sum=0;int num=0;
  int n,m;int v1,v2;int i;
  while(cin>>n>>m&&n){
    num++;
    ve.push_back(0);
    sum=0;

    for(i=1;i<=n;++i)
      ve.push_back(i);

    for( i=1;i<=m;++i){
      cin>>v1>>v2;
      unionset(v1,v2);
    }
    for(i=1;i<=n;++i)
      if(ve[i]==i)sum++;
    cout<<"Case "<<num<<": "<<sum<<endl;
    ve.clear();
  }
  return 0;
}

抱歉!评论已关闭.