Cod sursa(job #1105003)

Utilizator anaid96Nasue Diana anaid96 Data 11 februarie 2014 12:38:25
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 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()));
		fprintf(out,"%d",drumMin);
    }
    else
        fprintf(out,"%d",cost[1][noduri]);
          
       
    fclose(out);
    return 0;
}