Cod sursa(job #1916812)

Utilizator GeorgianBaditaBadita Marin-Georgian GeorgianBadita Data 9 martie 2017 10:25:22
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <vector>
#include <memory.h>
#include <algorithm>
#define NMAX 2001
#define INF 1e9
using namespace std;

int rf[NMAX][NMAX];
vector <int>  friends;
int N, M, K;

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

void readData() {
    scanf("%d%d", &N, &M);
    scanf("%d", &K);
      for(int i = 1; i<=N; i++)
        for(int j = 1; j<=N; j++)
            rf[i][j] = INF;
    for(int  i = 0; i<K; i++) {
            int x;
        scanf("%d", &x);
        friends.push_back(x);
    }
    for(int i = 1;i<=M; i++) {
        int x, y, cost;
        scanf("%d%d%d", &x, &y, &cost);
        rf[x][y] = rf[y][x] = cost;
    }
}

void royFloyd() {
    for(int k = 1; k<=N; k++) {
        for(int i = 1; i<=N; i++) {
            for(int j = 1; j<=N; j++)
                rf[i][j] = min(rf[i][j], rf[i][k] + rf[k][j]);
        }
    }
}
void solve() {
    royFloyd();
    if(K > 0) {
        sort(friends.begin(), friends.end());
        int ans = INF;
        do {
            int temp = rf[1][friends.front()] + rf[friends.back()][N];

            for(int i = 0; i<friends.size() - 1; i++)
                temp += rf[friends[i]][friends[i + 1]];
            ans = min(ans, temp);
        }while(next_permutation(friends.begin(), friends.end()));
        printf("%d", ans);
    }
    else printf("%d", rf[1][N]);
}
int main() {
    readData();
    solve();
}