Pagini recente » Cod sursa (job #1907713) | Cod sursa (job #1905398) | Cod sursa (job #350377) | Cod sursa (job #470343) | Cod sursa (job #700412)
Cod sursa(job #700412)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
FILE *g=fopen("ubuntzei.out","w");
int i,j,n,m,x,y,cost1,d[2010][2010],k,p[2010],c[20],min1=1<<30,uz[20];
struct muchie
{
int nod,cost;
};
vector<muchie> a[2010];
queue<int> q;
void det(int x)
{
int i,xx;
for(i=1;i<=n;++i)
d[x][i]=1<<30;
d[x][x]=0;
q.push(x);
while(!q.empty())
{
xx=q.front();
for(i=0;i<a[xx].size();++i)
if(d[x][a[xx][i].nod]>d[x][xx]+a[xx][i].cost)
d[x][a[xx][i].nod]=d[x][xx]+a[xx][i].cost,q.push(a[xx][i].nod);
q.pop();
}
}
void perm(int niv)
{
if(niv==k+1)
{
int sol=0;
sol+=d[1][p[c[1]]]+d[p[c[k]]][n];
for(int i=1;i<=k;++i)
sol+=d[p[c[i]]][p[c[i+1]]];
if(min1>sol)
min1=sol;
}
else
for(int i=1;i<=k;++i)
if(!uz[i])
{
uz[i]=1;
c[niv]=i;
perm(niv+1);
uz[i]=0;
}
}
int main()
{
FILE *f=fopen("ubuntzei.in","r");
fscanf(f,"%d%d",&n,&m);
fscanf(f,"%d",&k);
for(i=1;i<=k;++i)
fscanf(f,"%d",&p[i]);
for(i=1;i<=m;++i)
{
fscanf(f,"%d%d%d",&x,&y,&cost1);
a[x].push_back((muchie) {y,cost1});
a[y].push_back((muchie) {x,cost1});
}
for(i=1;i<=n;++i)
det(i);
if(k==0)
fprintf(g,"%d", d[1][n]);
else
{
perm(1);
fprintf(g,"%d",min1);
}
return 0;
}