Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- using namespace std;
- ifstream fin("flori2.in");
- ofstream fout("flori2.out");
- #define nmax 355
- int n,k,t[nmax+nmax],rg[nmax+nmax],x,nr,viz[nmax],m=0;
- vector <int> v[nmax];
- int Find(int nod)
- {
- while(nod!=t[nod])
- nod=t[nod];
- return nod;
- }
- void Union(int x, int y)
- {
- if(rg[x]<rg[y])
- t[x]=y;
- if(rg[y]<rg[x])
- t[y]=x;
- if(rg[x]==rg[y])
- {
- t[x]=y;
- rg[y]++;
- }
- }
- bool ok=0;
- int main()
- {
- fin>>n>>k;
- for(int i=1;i<=nmax+nmax;i++)
- {
- t[i]=i;
- rg[i]=1;
- }
- for(int i=1;i<=n;i++)
- {
- ok=0;
- for(int j=1;j<=k;j++)
- {
- fin>>x;
- if(Find(x)==x)
- Union(x,i+nmax);
- else
- {
- if(Find(i+nmax)!=Find(x))
- {
- int nr1=Find(x)-nmax;
- int nr2=Find(i+nmax)-nmax;
- if(!viz[nr1] && !viz[nr2])
- {
- m++;
- viz[nr1]=m;
- viz[nr2]=m;
- }
- else
- {
- if(!viz[nr1] && viz[nr2])
- viz[nr1]=viz[nr2];
- else if(viz[nr1] && !viz[nr2])
- viz[nr2]=viz[nr1];
- }
- Union(Find(i+nmax),Find(x));
- }
- }
- }
- }
- for(int i=1;i<=n;i++)
- {
- if(viz[i])
- v[viz[i]].push_back(i);
- else
- {
- m++;
- v[m].push_back(i);
- }
- }
- for(int i=1;i<=m;i++)
- {
- vector <int> ::iterator it;
- for(it=v[i].begin();it!=v[i].end();it++)
- fout<<*it<<" ";
- fout<<'\n';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement