poj 1611
#include<iostream>
#include<fstream>
using namespace std;
int f[30001],rank[30001];
int n,m;
void init(){
int i;
for(i=0;i<=n;i++){
f[i]=i;
rank[i]=0;
}
}
int father(int s){
if(s!=f[s])
f[s]=father(f[s]);
return f[s];
}
void unionset(int s,int t){
int i=father(s);
int j=father(t);
if(rank[i]<rank[j])
f[i]=j;
else
{
f[j]=i;
if(rank[i]==rank[j])
rank[i]++;
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t,w;
while(cin>>n>>m)
{
if(n==0&&m==0) return;
init();
for(i=1;i<=m;i++)
{
cin>>s;
cin>>k;
for(j=1;j<s;j++)
{
cin>>t;
if(father(k)!=father(t))
{
unionset(k,t);
}
k=t;
}
}
k=0;
j=father(0);
for(i=0;i<n;i++)
if(father(i)==j)
k++;
cout<<k<<endl;
}
}
int main(){
read();
return 0;
}
#include<fstream>
using namespace std;
int f[30001],rank[30001];
int n,m;
void init(){
int i;
for(i=0;i<=n;i++){
f[i]=i;
rank[i]=0;
}
}
int father(int s){
if(s!=f[s])
f[s]=father(f[s]);
return f[s];
}
void unionset(int s,int t){
int i=father(s);
int j=father(t);
if(rank[i]<rank[j])
f[i]=j;
else
{
f[j]=i;
if(rank[i]==rank[j])
rank[i]++;
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t,w;
while(cin>>n>>m)
{
if(n==0&&m==0) return;
init();
for(i=1;i<=m;i++)
{
cin>>s;
cin>>k;
for(j=1;j<s;j++)
{
cin>>t;
if(father(k)!=father(t))
{
unionset(k,t);
}
k=t;
}
}
k=0;
j=father(0);
for(i=0;i<n;i++)
if(father(i)==j)
k++;
cout<<k<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号