Pagini recente » Cod sursa (job #2906935) | Cod sursa (job #1948419) | Cod sursa (job #1866842) | Cod sursa (job #2297974) | Cod sursa (job #685731)
Cod sursa(job #685731)
#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(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--;
}
}
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));
}