Cod sursa(job #1104943)

Utilizator anaid96Nasue Diana anaid96 Data 11 februarie 2014 11:30:29
Problema Ubuntzei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
  
using namespace std;
  
FILE *in, *out;
 
//definitii
#define pb push_back
 
//constante
const int Nmax = 2005;
const int oo = 0x3f3f3f3f;
  
//variabile
int noduri, muchii, loc, x;
vector<int> localitati;
int nod1, nod2, dist;
int cost[Nmax][Nmax];
int distTot, drumMin;
  
int main(void)
{
    in = fopen("ubuntzei.in","rt");
      
    fscanf(in,"%d%d%d",&noduri, &muchii, &loc);
    for(int i = 0; i<loc; ++i)
    {   
        fscanf(in, "%d", &x);
        localitati.pb(x);
    }   
      
    memset(cost,  oo, sizeof(cost));
     
    for(int i=1; i<=noduri; ++i)
        cost[i][i] = 0;
 
    while(muchii--)
    {
        fscanf(in, "%d%d%d", &nod1, &nod2, &dist);
        cost[nod1][nod2] = cost[nod2][nod1] = dist;     
    }
      
    fclose(in);
    
    for(int h=1 ; h<=noduri ; ++h)
        for(int i = 1 ; i<=noduri ; ++i)
        {   
            if(i==h)
                continue;
            for(int j = 1 ; j<=noduri ; ++j)
                cost[i][j] = min(cost[i][j], cost[i][h] + cost[h][j]);
        }       
     
    out = fopen("ubuntzei.out","wt");   
    if(loc > 0)
    {
        sort(localitati.begin(),localitati.end());
        drumMin = oo;
         
        do
        {
            int destTot = cost[1][localitati[0]] + cost[localitati[loc-1]][noduri];
            //vector<int> :: iterator it, end = localitati.end()-1;
            //for(it = localitati.begin(); it!=end; ++it)
			int limit = loc-1;
            for(int i=0 ; i<limit ; ++i)
                destTot += cost[localitati[i]][localitati[i+1]];
            drumMin = min(drumMin, destTot);
        }   
        while(next_permutation(localitati.begin(),localitati.end()));
    }
    else
        while(1);
         
  
    fprintf(out,"%d",drumMin);
      
    fclose(out);
    return 0;
}