Pagini recente » Cod sursa (job #3221578) | Cod sursa (job #1596723) | Cod sursa (job #3185162) | Cod sursa (job #846555) | Cod sursa (job #1650965)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#define inf 1000
using namespace std;
FILE *f=fopen("ubuntzei.in","r"),
*g=fopen("ubuntzei.out","w");
int N,M,K,s;
vector <int> c,d;
vector <vector <int>> a;
vector <char> viz;
struct pct{
int di,nr;};
bool comp(pct a, pct b)
{
return (a.di<b.di);
}
int main()
{
int N,M,K,s=0;
fscanf(f,"%d%d%d",&N,&M,&K);
c.resize(K+1);
a.resize(N+1);
d.resize(N+1);
viz.resize(N+1);
for(int i=1;i<=N;i++) a[i].resize(N+1,inf);
for (int i=1;i<=N;i++)
fscanf(f,"%d",&c[i]);
int x,y,z;
for(int i=1;i<=M;i++)
{
fscanf(f,"%d%d%d",&x,&y,&z);
a[x][y]=a[y][x]=z;
}
fclose(f);
for(int i=1;i<=N;i++) {viz[i]=0;d[i]=inf;}
int start;int k,mmin;
for( start=1;start<=1+K;start++)
{
for(int i=1;i<=N;i++) {viz[i]=0;
if(a[start][i]<inf) d[i]=a[start][i];
else d[i]=inf;}
viz[start]=1;
d[start]=0;
for(int j=1;j<N;j++)
{
mmin=inf;
for(int i=1;i<=N;i++) if(viz[i]==0&&d[i]<mmin) mmin=d[i],k=i;
viz[k]=1;
for(int i=1;i<=N;i++)
if(viz[i]==0&&d[i]>d[k]+a[i][k])
d[i]=d[k]+a[i][k];
}
s+=d[c[start]];
start=c[start];
}
for(int i=1;i<=N;i++) {viz[i]=0;
if(a[start][i]<inf) d[i]=a[start][i];
else d[i]=inf;}
viz[start]=1;
d[start]=0;
for(int j=1;j<N;j++)
{
mmin=inf;
for(int i=1;i<=N;i++) if(viz[i]==0&&d[i]<mmin) mmin=d[i],k=i;
viz[k]=1;
for(int i=1;i<=N;i++)
if(viz[i]==0&&d[i]>d[k]+a[i][k])
d[i]=d[k]+a[i][k];
s+=d[N];
fprintf(g,"%d ",s);
fclose(g);
return 0;
}
}