Cod sursa(job #1639277)

Utilizator mag9e2014MAG E 2014 mag9e2014 Data 8 martie 2016 11:37:48
Problema Ubuntzei Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 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 k =0; k<baratok.size(); k++)
                    {
                        if (current==baratok[k])
                            baratok.erase(baratok.begin()+k);
                    }
                    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;
}