Pagini recente » Cod sursa (job #1079670) | Cod sursa (job #1556289) | Cod sursa (job #21008) | Cod sursa (job #1434641) | Cod sursa (job #685757)
Cod sursa(job #685757)
#include <stdio.h>
#include <vector>
#include <bitset>
#include <string.h>
using namespace std;
#define MAXN 2005
vector<pair<int, int> > loc[MAXN];
int n, m, ubu[20], k, pornire, distMin[20][20];
int dist[2005];
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;
dist[nod] = lung;
//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(dist[it->first] == 0 || dist[it->first] > lung + it->second)
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;
ubuntzel[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;
}
ubuntzel[n] = 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;
memset(dist, 0, sizeof(int[MAXN]));
dfs(ubu[i], 0);
}
fprintf(out, "%i", back(1, 0));
}