Cod sursa(job #1246011)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 20 octombrie 2014 13:32:30
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
/// Craciun Catalin
///  Ubuntzei
///   OJI2011
#include <iostream>
#include <fstream>
#include <climits>
#include <cstring>
#include <vector>

// #define DBG 1
#define NMax 2005

using namespace std;

ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");

int n,m,k;
int C[NMax];
int Visited[NMax];
int minim = INT_MAX;
int pathLen = 0;
int V[NMax][NMax]; /// Matricea costurilor

void read() {

    f>>n>>m;
    f>>k;

    memset(C, 0, sizeof(C));
    memset(Visited, 0, sizeof(Visited));

    for (int i=1;i<=k;i++) {
        int x;
        f>>x;
        C[x] = 1;
    }
    for (int i=1;i<=m;i++) {
        int x, y, len;
        f>>x>>y>>len;
        V[x][y] = len;
        //V[y][x] = len;
    }

    f.close();
}

/// DFS
void reachedDest() {

    bool eligiblePath = true;

    for (int i=1;i<=n && eligiblePath;i++) {
        if (C[i] == 1 && Visited[i] != 1)
            eligiblePath = false;
    }

    if (eligiblePath) {
        if (minim > pathLen)
            minim = pathLen;
    }
}

void dfs(int k) {

    if (k == n) {
        reachedDest();
    }

    for (int i=k+1;i<=n;i++) {
        if (V[k][i] != 0) {
        #ifdef DBG
            cout<<"going to "<<i<<endl;
        #endif // DBG
            Visited[i] = 1;
            pathLen += V[k][i];

            dfs(i);

        #ifdef DBG
            cout<<"leaving from "<<i<<endl;
        #endif // DBG
            Visited[i] = 0;
            pathLen -= V[k][i];
        }
    }
}

int main() {

    read();
    Visited[1] = 1; pathLen = 0;
    dfs(1);
    g<<minim<<'\n';

    g.close();

    return 0;
}