Pagini recente » Istoria paginii runda/preoji_bv_1/clasament | Cod sursa (job #2032041) | Cod sursa (job #607316) | Cod sursa (job #2014412) | Cod sursa (job #1650951)
#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;
vector <vector <int>> a;
char viz[50];
struct pct{
int di,nr;};
int d[50];
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);
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;
}
for(int i=1;i<=N;i++) {viz[i]=0;d[i]=inf;}
int start;
for( start=1;start<=1+K;start++)
{
int k,mmin;
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];
}
int k,mmin;
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);
return 0;
}}