Cod sursa(job #891770)

Utilizator marius_devMarius Filiuta marius_dev Data 25 februarie 2013 19:45:18
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<utility>
#include<queue>
#include<vector>
#include<string.h>

using namespace std;

#define edge pair<int,int>
#define mp make_pair
#define pb push_back
#define node second
#define cost first

const int MAX_SIZE=2e3+3;
const int oo=(1<<30)-1;

vector<edge> graph[MAX_SIZE];
vector<edge> graph_mc[MAX_SIZE];
vector<int> dist(MAX_SIZE,oo);
vector<edge>::iterator it,end;

priority_queue<edge, vector<edge>, greater<edge> > heap;

int dmin(long long viz[MAX_SIZE], long long poz)
{
    viz[poz]=1;
    int c[MAX_SIZE],k=0;
    it=graph_mc[poz].begin();
    end=graph_mc[poz].end();
    cout<<"\n";
    for( ; it!=end-1; it++)
        if(!viz[it->node])
        {
            cout<<it->node<<"-";
            c[++k]=it->cost+dmin(viz, it->node);
        }
    if(!k)
        return (end-1)->cost;
    return (int)min_element(c,c+k);
}

int main ()
{
    ifstream in("ubuntzei.in");
    ofstream out("ubuntzei.out");

    long long n,m,k,c[MAX_SIZE],viz[MAX_SIZE],drum=0;
    in>>n>>m>>k;
    c[0]=1;
    c[k+1]=n;
    for(int i=1;i<=k;i++)
        in>>c[i];
    sort(c,c+k+1);
    for(int i=1;i<=m;i++)
    {
        int cTo,cFrom,cCost;
        in>>cFrom>>cTo>>cCost;
        graph[cFrom].pb(mp(cCost,cTo));
        graph[cTo].pb(mp(cCost,cFrom));
    }
    for(int i=0;i<=k;i++)
    {
        if(c[i]==c[i+1])
            continue;
        heap.push(mp(0,c[i]));
        dist[c[i]]=0;
        while(!heap.empty())
        {
            int current=heap.top().node;
            heap.pop();
            it=graph[current].begin();
            end=graph[current].end();
            for(;it!=end;++it)
            if(dist[current]+it->cost<dist[it->node])
            {
                dist[it->node]=dist[current]+it->cost;
                heap.push(mp(dist[it->node],it->node));
            }
        }
        for(int j=i+1;j<=k+1;j++)
        {
            graph_mc[i].pb(mp(dist[c[j]],j));
            graph_mc[j].pb(mp(dist[c[j]],i));
        }
        //drum+=dist[c[i+1]];
        dist.clear();
        dist.assign(MAX_SIZE,oo);
    }
    for(int i=0;i<=k+1;i++,cout<<"\n")
    {
        it=graph_mc[i].begin();
        end=graph_mc[i].end();
        for(;it!=end;++it,cout<<" | ")
        {
            cout<<i<<"->"<<it->node<<"="<<it->cost;
        }
    }
    memset(viz,0,k);
    viz[k+1]=0;
    drum=dmin(viz, 0);
    out<<drum;
    in.close();
    out.close();

    return 0;

}