Cod sursa(job #1104476)

Utilizator anaid96Nasue Diana anaid96 Data 10 februarie 2014 20:11:38
Problema Ubuntzei Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 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=205;
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]);
        }       
    
	
	if(loc>0)
	{
		sort(localitati.begin(),localitati.end());
		drumMin=oo;
		
		do
		{
			int destTot=cost[1][localitati.front()] + cost[localitati.back()][noduri];
			//vector<int> :: iterator it,end=localitati.end()-1;
			//for(it=localitati.begin(); it!=end; ++it)
			for(int i=0; i< (int) localitati.size()-1; ++i)
				destTot+=cost[localitati[i]][localitati[i+1]];
			drumMin=min(drumMin,destTot);
			
		}	
		while(next_permutation(localitati.begin(),localitati.end()));
	}
	else
		fprintf(out,"%d",cost[1][noduri]);
     
    out=fopen("ubuntzei.out","wt");     
 
    fprintf(out,"%d",drumMin);
     
    fclose(out);
    return 0;
}