Cod sursa(job #685738)

Utilizator milijrCristian Militaru milijr Data 21 februarie 2012 09:47:50
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <stdio.h>
#include <vector>
#include <bitset>

using namespace std;

#define MAXN 2005
vector<pair<int, int> > loc[MAXN];
int n, m, ubu[20], k, pornire, distMin[20][20];
bitset<MAXN> viz;
typedef vector<pair<int, int> >::iterator iter;
int ubuntzel[2005];

/*int ubuntzel(int nod)
{
	for(int i = 1; i <= k; i++)
		if(ubu[i] == nod)
			return i;
	return 0;
}*/

void dfs(int nod, int lung)
{
	iter it;
	viz[nod] = 1;
	{
		int a = ubuntzel[nod];
		if(a > 0)
		{
			if(distMin[pornire][a] > lung || distMin[pornire][a] == 0)
				distMin[pornire][a] = distMin[a][pornire] = lung;
		}
	}
	for(it = loc[nod].begin(); it != loc[nod].end(); it++)
	{
		if(!viz[it->first])
			dfs(it->first, lung + it->second);
	}
	viz[nod] = 0;
}

int back(int ubuntz, int sum)
{
	viz[ubuntz] = 1;
	int i, aux = 0, sumMin = 1 << 30;
	for(i = 2; i <= k - 1; i++)
	{
		if(!viz[i])
		{
			aux = back(i, sum + distMin[ubuntz][i]);
			if(aux < sumMin)
				sumMin = aux;
		}
	}
	viz[ubuntz] = 0;
	if(aux == 0)
	{
		//toti ubuntzeii sunt vizitati
		return (sum + distMin[ubuntz][k]);
	}
	return sumMin;
}

int main()
{
	int i, nod1, nod2, cost;
	FILE *in  = fopen("ubuntzei.in",  "r");
	FILE *out = fopen("ubuntzei.out", "w");
	
	fscanf(in, "%i %i", &n, &m);
	fscanf(in, "%i", &k);
	
	k += 2;
	ubu[1] = 1;
	ubu[k] = n;
	
	for(i = 2; i <= k - 1; i++)
	{
		fscanf(in, "%i", &ubu[i]);
		if(ubu[i] == 1 || ubu[i] == n)
		{
			i--;
			k--;
		}
		else
			ubuntzel[ubu[i]] = i;
	}
	
	for(i = 1; i <= m; i++)
	{
		fscanf(in, "%i %i %i", &nod1, &nod2, &cost);
		loc[nod1].push_back(pair<int, int>(nod2, cost));
		loc[nod2].push_back(pair<int, int>(nod1, cost));
	}
	
	for(i = 1; i <= k; i++)
	{
		pornire = i;
		dfs(ubu[i], 0);
	}
	
	fprintf(out, "%i", back(1, 0));
}