Cod sursa(job #2452898)

Utilizator Stefan3002Stefan Stefan3002 Data 1 septembrie 2019 17:25:38
Problema Ubuntzei Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <functional>
#include <queue>
using namespace std;

ifstream intrare("ubuntzei.in");
ofstream iesire("ubuntzei.out");
const int NMAX=2005,oo=(1<<30);
int dist2[NMAX];
vector < pair < int , int > >graf[NMAX];
priority_queue < int , vector < int > , greater < int > >c;
int graf2[4][NMAX];

int i,j,n,m,p,k,dist[NMAX][NMAX],prieteni[NMAX];
bool vizitat[NMAX];





void Dijkstra(int x, int avoid,int avoid2)
{

    for(i=1; i<=n; i++)
    {
        dist[x][i]=oo;
        vizitat[i]=0;
    }



    c.push(x);
    vizitat[x]=true;
    dist[x][x]=0;

    while(!c.empty())
    {
        int nod=c.top();
        c.pop();
        vizitat[nod]=false;
        for(size_t i=0; i<graf[nod].size(); i++)
        {
            int vecin=graf[nod][i].first;
            int cost=graf[nod][i].second;
            int costnou=dist[x][nod]+cost;
            if(costnou<dist[x][vecin] && vecin!=avoid && vecin!=avoid2)
            {
                dist[x][vecin]=costnou;
                if(!vizitat[vecin])
                {
                    c.push(vecin);
                    vizitat[vecin]=true;
                }
            }
        }



    }




}

void schimba(int &x,int &y)
{
    x=x^y;
    y=y^x;
    x=x^y;
}





int main()
{
    intrare>>n>>m;
    intrare>>k;
    for(i=1; i<=k; i++)
        intrare>>prieteni[i];
    for(i=1; i<=m; i++)
    {
        int a,b,c;
        intrare>>a>>b>>c;
        graf[a].push_back(make_pair(b,c));
        graf[b].push_back(make_pair(a,c));
    }

    if(k!=0)
    {

        for(j=1; j<=k; j++)
            Dijkstra(prieteni[j],n,1);


        Dijkstra(1,n,0);
        Dijkstra(n,1,0);



        for(i=1; i<=k; i++)
        {
            graf2[1][i]=1;
            graf2[2][i]=prieteni[i];
            graf2[3][i]=dist[1][prieteni[i]];
        }
        int l=1;
        for(i=k+1; i<=2*k; i++)
        {
            graf2[1][i]=n;
            graf2[2][i]=prieteni[l];
            graf2[3][i]=dist[n][prieteni[l++]];
        }

        i=2*k+1;
        for(j=1; j<=k; j++)
            for(int g=1; g<=k; g++)
            {
                if(j!=g)
                {
                    graf2[1][i]=prieteni[j];
                    graf2[2][i]=prieteni[g];
                    graf2[3][i]=dist[prieteni[j]][prieteni[g]];
                    i++;
                }

            }


        int total=(2*k)+(k*k)-k;




        int xx=0;
        do
        {
            xx=0;
            for(i=1; i<=total-1; i++)
                if(graf2[3][i]>graf2[3][i+1])
                {
                    schimba(graf2[1][i],graf2[1][i+1]);
                    schimba(graf2[2][i],graf2[2][i+1]);
                    schimba(graf2[3][i],graf2[3][i+1]);
                    xx=1;
                }




        }
        while(xx==1);


for(i=1;i<=total;i++)
        cout<<graf2[1][i]<<" "<<graf2[2][i]<<" "<<graf2[3][i]<<endl;



        int s[k+3];
        s[1]=1;
        s[n]=n;

        for(i=1; i<=k; i++)
            s[prieteni[i]]=prieteni[i];

        prieteni[0]=1;
        prieteni[k+1]=n;

//for(i=0;i<=k+1;i++)
        // cout<<prieteni[i]<<" ";



        int h=0;
        int i=1;
        int cost=0;
        while(h<(k+1))
        {
            if(s[graf2[1][i]]!=s[graf2[2][i]] )
            {
                cost+=graf2[3][i];
                h++;
                int co1=s[graf2[1][i]];
                int co2=s[graf2[2][i]];
                for(j=0; j<=k+1; j++)
                    if(s[prieteni[j]]==co2)
                        s[prieteni[j]]=co1;
            }
            i++;

        }
//for(i=0;i<=k+1;i++)
        // cout<<s[prieteni[i]]<<endl;

        iesire<<cost;

    }
    else
    {
        Dijkstra(1,0,0);
        iesire<<dist[1][n];
    }



    return 0;
}