Cod sursa(job #1044107)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 29 noiembrie 2013 12:34:02
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include <fstream>
#include <utility>
#include <queue>
#include <bitset>
#include <vector>
using namespace std;

unsigned short int et[50005];
unsigned short int gaseste(unsigned short int x)
{
    if(et[x]!=x)
        et[x]=gaseste(et[x]);
    return et[x];
}

void uneste(unsigned short int x,unsigned short int y)
{
    x=gaseste(x);
    y=gaseste(y);
    et[x]=y;
}

int main()
{

    ifstream cin("camionas.in");
    ofstream cout("camionas.out");
    unsigned short n,x,y;
    int m=0,z,g,i;

    cin>>n>>m>>g;

    for(i=1;i<=n;i++)
        et[i]=i;

    for(i=0;i<m;i++)
    {
        cin>>x>>y>>z;
        if(z>=g)
            uneste(x,y);
    }

    unsigned short int d[50005];
    bitset<50005> viz;

    for(i=1;i<=n;i++)
    {
        gaseste(i);
        //cout<<i<<' '<<et[i]<<endl;
        viz[i]=0;
        d[i]=0;
    }
    cin.close();
    cin.open("camionas.in");

    cin>>n>>m>>g;

vector<unsigned short int> graf[50005];
vector<unsigned short int>::iterator it;
queue<unsigned short int> coada;

    while(!coada.empty())
        coada.pop();
    for(i=1;i<=n;i++)
        graf[i].clear();


    for(i=0;i<m;i++)
    {
        cin>>x>>y>>z;
        if(z<g)
        {
            graf[et[x]].push_back(et[y]);
            graf[et[y]].push_back(et[x]);
        }
    }

    coada.push(et[1]);
    viz[et[1]]=1;
    d[et[1]]=0;
    if(et[n]==et[1])
    {
        cout<<"0\n";
        cin.close();
        cout.close();
        return 0;
    }

    while(!coada.empty())
    {
        y=coada.front();
        coada.pop();

        for(it=graf[y].begin();it!=graf[y].end();it++)
            if(!viz[*it])
            {
                viz[*it]=1;
                d[*it]=d[y]+1;
                if(*it==et[n])
                {
                    cout<<d[*it]<<'\n';
                    cin.close();
                    cout.close();
                    return 0;
                }
                coada.push(*it);
            }
    }

    return 0;
}