Cod sursa(job #995105)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 7 septembrie 2013 15:11:17
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
#include <algorithm>
#include <climits>

FILE *f=fopen("ubuntzei.in","r");
FILE *g=fopen("ubuntzei.out","w");

#define pb push_back
#define mp make_pair
#define v first
#define cost second

using namespace std;
const int Nmax=2005,Mmax=10005,INF=INT_MAX/2;

int N,M,K,nodes[16],D[Nmax][Nmax],way[16];
char used[Nmax][Nmax];

vector<pair<int,int> > lv[Nmax];
vector<pair<int,int> > ::iterator it;

struct cmp{
    bool operator()(const pair<int,int> A, const pair<int,int> B)const
    {
        return A.second > B.second;
    }
};
priority_queue<pair<int,int> , vector<pair<int,int> >,cmp> Q;

void get_graph()
{
    fscanf(f,"%d%d%d",&N,&M,&K);
    for(int i=1;i<=K;++i)fscanf(f,"%d", &way[i]);
    int a,b,c;
    for(int i=1;i<=M;++i)
    {
        fscanf(f,"%d%d%d",&a,&b,&c);
        lv[a].pb(mp(b,c));
        lv[b].pb(mp(a,c));
    }
}

void dijkstra(int k)
{
    Q.push(mp(k,0));
    for(int i=1;i<=N;++i)
        D[k][i]=INF;
    D[k][k]=0;
    int nodc,cst;
    while(!Q.empty())
    {
        nodc=Q.top().v;
        Q.pop();
        used[k][nodc]=1;
        for(it=lv[nodc].begin();it!=lv[nodc].end();++it)
        if(!used[k][it->v] && D[k][it->v] > D[k][nodc] + it->cost)
        {
            D[k][it->v]= D[k][nodc]+it->cost;
            Q.push(mp(it->v,D[k][it->v]));
        }
    }
}

void solve()
{
    if(K==0){fprintf(g,"%d",D[1][N]);return;}
    sort(way+1,way+K+1);
    int answer=INF,mini=0;
    do
    {
        mini=D[1][way[1]];

        for(int i=2;i<=K;++i)
            mini+=D[way[i-1]][way[i]];

        mini+=D[way[K]][N];

        if(mini<answer)answer=mini;
    }while(next_permutation(way+1,way+min(K+1,12)));
    fprintf(g,"%d",answer);
}

int main()
{
    get_graph();
    for(int i=1;i<=N;++i)dijkstra(i);
    solve();
    return 0;
}