Cod sursa(job #891071)

Utilizator ard_procesoareLupicu ard_procesoare Data 25 februarie 2013 13:27:29
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define NMAX 2005
vector <int> v[NMAX],cost[NMAX];
queue <int> qnod;
int n,m,k,drum[NMAX];
int ck[20];
bool check[NMAX][20],viz[NMAX],ever[NMAX];
void read()
{
    int a,b,c;
    fin>>n>>m>>k;
    for(int i=1;i<=k;i++)
    {
        fin>>ck[i];
        check[ck[i]][i] = true;
    }
    for(int i=1;i<=m;i++)
    {
        fin>>a>>b>>c;
        v[a].push_back(b);
        v[b].push_back(a);
        cost[a].push_back(c);
        cost[b].push_back(c);
    }
}
int verif(int nod,int vnodi)
{
    bool c1,c2;
    c1=c2=false;
    for(int i=1;i<=15;i++)
    {
        if(check[nod][i]>check[vnodi][i])
            c1=true;
        if(check[nod][i]<check[vnodi][i])
            c2=true;
    }
    if(c1==false && c2==false)
        return 1;
    if(c1==true && c2==false)
        return 2;
    if(c1==false && c2==true)
        return 3;
    return 4;
}
void tipar_drum()
{
    for(int i=1;i<=n;i++)
        fout<<drum[i]<<" ";
    fout<<"\n";
}
void baga(int nod,int vnodi)
{
    for(int i=1;i<=n;i++)
        if(check[nod][i]) check[vnodi][i] = true;
}
void bfs()
{
    qnod.push(1);
    int nod;
    int z;
    ever[1]=true;
    while(!qnod.empty())
    {
        nod=qnod.front();
        qnod.pop();
        viz[nod]=false;
        for(int i=0;i<v[nod].size();i++)
        {
            if(ever[v[nod][i]] == false)
            {
                z=0;
                drum[v[nod][i]] = drum[nod]+cost[nod][i];
                baga(nod,v[nod][i]);
            }
            else
                z=verif(nod,v[nod][i]);
            if(z==1)
            {
                if(drum[v[nod][i]] < drum[nod]+cost[nod][i])
                    continue;
                drum[v[nod][i]] = drum[nod]+cost[nod][i];
            }
            if(z==2)
            {
                drum[v[nod][i]] = drum[nod]+cost[nod][i];
                baga(nod,v[nod][i]);
            }
            if(z==3)
                continue;
            if(z==4)
            {
                drum[v[nod][i]] +=drum[nod]+cost[nod][i];
                baga(nod,v[nod][i]);
            }
            if(viz[v[nod][i]] == false)
                    qnod.push(v[nod][i]);
            viz[v[nod][i]] = true;
            ever[v[nod][i]] = true;
        }
       // fout<<nod<<" : \n"; tipar_drum();
    }
}
void tipar()
{
    for(int i=1;i<=n;i++)
        for(int j=0;j<v[i].size();j++)
            fout<<i<<" "<<v[i][j]<<" "<<cost[i][j]<<"\n";
    fout<<"-----\n";
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<20;j++)
            fout<<check[i][j]<<" ";
        fout<<"\n";
    }
}
int main()
{
    read();
    bfs();
   // tipar();
    fout<<drum[n];
}