Cod sursa(job #1644869)

Utilizator ZeratulVeress Szilard Zeratul Data 10 martie 2016 09:59:16
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

struct varoskoz
{
    int s,tav;
};

int n,m,k;
int Baratok[16];
int tavok[2001][16]; ///i-edik varosban j darab ubuntuval.
bool ittVanUbuntu[2001];

vector <varoskoz> varos[2001];

struct emberke
{
    int poz, ubuntuk, tav;
};

bool kibaszas(emberke now)
{
    for (int i = now.ubuntuk + 1;i<=k;i++)
    {
        if (tavok[now.poz][i] <= now.tav)
        {
            //cout<<tavok[now.poz][i]<<" "<<now.tav<<endl;
            return true;
        }
    }
    return false;
}

int main()
{

    ifstream be("ubuntzei.in");
    be>>n>>m>>k;

    for (int i=0;i<n+1;i++)
    {
        for (int j=0;j<k+1;j++)
        {
            tavok[i][j] = 1000000009;
        }
    }

    for (int i=0;i<k;i++)
    {
        int q;
        be>>q;
        ittVanUbuntu[q] = true;
       // cout<<q<<endl;
    }
    //cout<<ittVanUbuntu[0]<<ittVanUbuntu[1]<<ittVanUbuntu[2]<<endl;

    for (int i=0;i<m;i++)
    {
        int x,y,z;
        varoskoz now;
        be>>x>>y>>z;
        now.s = y;
        now.tav = z;
        varos[x].push_back(now);
        now.s = x;
        varos[y].push_back(now);
    }
    be.close();

    queue <emberke> c;
    emberke now,now2;
    now.poz = 1;
    now.tav = 0;
    now.ubuntuk = 0;
    c.push(now);

    while (!c.empty())
    {
        now = c.front();
        c.pop();
        //cout<<"Poz:"<<now.poz<<"   Ubuntuk:"<<now.ubuntuk<<"   Tav:"<<now.tav<<endl;

if (!kibaszas(now) or (now.poz == n and now.ubuntuk == k)) /// itt jobb vagy a vegen?
{
        int Meret = varos[now.poz].size();
        for (int i=0;i<Meret;i++)
        {
            //cout<<"i = "<<i<<endl;
            if(varos[now.poz][i].tav + now.tav < tavok[varos[now.poz][i].s][now.ubuntuk + ittVanUbuntu[varos[now.poz][i].s]]/* and !kibaszas()*/)
            {
                now2.poz = varos[now.poz][i].s;
                now2.tav  = varos[now.poz][i].tav + now.tav;
                now2.ubuntuk = now.ubuntuk + ittVanUbuntu[now2.poz];
                //cout<<"itt: "<<ittVanUbuntu[2];
                //cout<<"PUSHED    :    Poz:"<<now2.poz<<"   Ubuntuk:"<<now2.ubuntuk<<"   Tav:"<<now2.tav<<endl;
                tavok[now2.poz][now2.ubuntuk]  = now2.tav;
                c.push(now2);
            }
        }
}
else
{
   // cout<<"Kib"<<endl;
}

    }

    /*for (int i = 0;i<=k;i++)
    {
        cout<<tavok[n][i]<<" ";
    }*/
    ofstream ki("ubuntzei.out");

    ki<<tavok[n][k];
    ki.close();

    return 0;
}