Cod sursa(job #1149653)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 22 martie 2014 10:19:41
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream f("flori.in");
ofstream g("flori.out");
int n, m, i, j, v[1010][1010], x, d[1010], p;

vector<int> L[1010], a[1010];

inline int radacina(int x){
    if(d[x]<0)
        return x;
    return d[x];
}

int main(){
    freopen("flori.in", "r", stdin);
    freopen("flori.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            scanf("%d", &x);
            if(L[x].size()==0)
                L[x].push_back(i);
            else if(L[x].back()!=i)
                L[x].push_back(i);
        }
    for(i=1; i<=n; i++)
        d[i]=-1;
    for(i=0; i<1001; i++)
    {
        if(L[i].size()>0)
        {
            p=radacina(L[i][0]);
            for(j=1; j<L[i].size(); j++)
            {
                x=radacina(L[i][j]);
                if(p!=x)
                {
                    if(d[p]>d[x])
                    {
                        d[x]+=d[p];
                        d[p]=x;
                        p=x;
                    }
                    else
                    {
                        d[p]+=d[x];
                        d[x]=p;
                    }
                }
            }
        }
    }
    for(i=1; i<=n; i++)
    {
        if(d[i]<0)
            a[i].push_back(i);
        else
            a[ radacina(i) ].push_back(i);
    }
    for(i=1; i<=n; i++)
    {
        if(a[i].size()>0)
        {
            for(j=0; j<a[i].size(); j++)
                g<<a[i][j]<<' ';
            g<<"\n";
        }
    }
    return 0;
}