Cod sursa(job #1639267)

Utilizator mag9e2014MAG E 2014 mag9e2014 Data 8 martie 2016 11:35:57
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <iostream>
#include <fstream>
#include <queue>

using namespace std;

int main()
{
    ifstream be("ubuntzei.in");
    ofstream ki("ubuntzei.out");
    int n,m;
    be>>n>>m;
    int matrix[n+1][n+1];
    int matrix2[n+1][n+1];
    int k;
    for (int i=1;i<=n;i++)
    {
        for (int l=1;l<=n;l++)
        {
            matrix[i][l]=0;
            matrix2[i][l]=0;
        }
    }
    int tomb[n+1];
    for (int i=1;i<=n;i++)
    {

         tomb[i]=0;
    }
    int a;
    be>>k;
    vector <int>baratok;
    for (int i=1;i<=k;i++)
        {
            be>>a;
        baratok.push_back(a);
        }
        int x,y,z;
    for (int i=1;i<=m;i++)
    {
        be>>x>>y>>z;
    matrix[x][y]=z;
    matrix[y][x]=z;
    matrix2[x][y]=z;
    matrix2[y][x]=z;
    }



    queue <int> sor;
    sor.push(1);
    int current;
       bool ures=false;
       if(baratok.empty())
        ures=true;
    while (!sor.empty())
    {
        current=sor.front();
        sor.pop();
        for (int i=1;i<=n;i++)
        {
            if (matrix[i][current]!=0)
            {

                if (tomb[i]==0 )
                    tomb[i]=tomb[current]+matrix[i][current];
                else if (tomb[i]>tomb[current]+matrix[i][current])
                    tomb[i]=tomb[current]+matrix[i][current];
                matrix[i][current]=0;
                matrix[current][i]=0;
                sor.push(i);

     if(!ures)
     {


        for (int i =0;i<baratok.size();i++)
        {
            if (current==baratok[i])
                baratok.erase(baratok.begin()+i);
        }
        if (baratok.empty())
            break;
            }

        }
    }
    if (!ures)
    {


    int sum = tomb[current];
    int b =current;
    sor.push(n);
    for (int i=1;i<=n;i++)
        tomb[i]=0;
    while (!sor.empty())
    {
        current=sor.front();
        sor.pop();
        for (int i=1;i<=n;i++)
        {
            if (matrix2[i][current]!=0)
            {

                if (tomb[i]==0 )
                    tomb[i]=tomb[current]+matrix2[i][current];
                else if (tomb[i]>tomb[current]+matrix2[i][current])
                    tomb[i]=tomb[current]+matrix2[i][current];
                matrix2[i][current]=0;
                matrix2[current][i]=0;
                sor.push(i);
                if (current==b)
                {



                       break;
                }

            }
        }
    }
   ki<<sum+tomb[current];
    }
    else
        ki<<tomb[n];

    return 0;
}