Pagini recente » Profil eudanip | Cod sursa (job #1391041) | Cod sursa (job #1568942) | Cod sursa (job #1186282) | Cod sursa (job #2527828)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
vector <int> muchii[10000];//declarare vector muchii
queue <int> coada;//declarare coada
int mat[2001][2001]={0};//matrice de costuri
int distanta[2001];
void blank(int m)//face -1 vectorul distanta
{
for(int i=0;i<=m;i++)
distanta[i]=-1;
}
void bts()
{
while(!coada.empty())//cat timp mai sunt elemente in coada
{
int nod=coada.front();//declara nodul curent
coada.pop();
for(unsigned int i=0;i<muchii[nod].size();i++)//verifica vecinii
{
int vecin=muchii[nod][i];//declara vecinii
int distanta_posibila=distanta[nod]+mat[nod][vecin];//distanta posibila este suma dintre distanta pana la nodul actual pana la nodul urmator
int distanta_categorica=distanta[vecin];
//->se compara distanta posbila cu distanta categorica
if(distanta_posibila<distanta_categorica||distanta_categorica==-1)//daca este -1 distanta atunci aplica algoritmul deoarece -1 inseamna ca nu este parcurs
{
distanta[vecin]=distanta_posibila;//distanta posibila devine actuala deoarece este mai mica
coada.push(vecin);//adauga vecinul in coada
}
}
}
}
int main()
{
ifstream f("ubuntzei.in");//sterge txt-ul
ofstream g("ubuntzei.out");
int n,m; f>>n>>m;//citire muchii si laturi
int k,sir_k[2000];f>>k;
for(int i=1;i<=k;i++)//citeste sirul de prieteni
{
int x;f>>x;
sir_k[i]=x;
}
for(int i=1;i<=m;i++)//citire fisier matrice
{
int x,y,z;
f>>x>>y>>z;
muchii[x].push_back(y);
muchii[y].push_back(x);
mat[x][y]=z;
mat[y][x]=z;
}
blank(m);//face vectorul distanta -1 pentru a putea aplica bts
coada.push(1);
distanta[1]=0;
bts();
cout<<endl;
//for(int i=1;i<=n;i++)
//cout<<distanta[i]<<" ";
long int rez_final=0;
long int minim=99999,mini,mini2;//minim este distanta pana la cel mai apropiat prieten si mini numarul de ordine al acestuia iar mini2 pozitia in sirul k a prietenului care a fost luat
for(int i=1;i<=k;i++)//parcurge de k or sirul de prieteni pana dispar toti prietenii
{
for(int j=1;j<=k;j++)//parcurge prietenii
{
int prieten=sir_k[j];
if(distanta[prieten]<minim&&prieten!=-1)
{
minim=distanta[prieten];
mini=prieten;
mini2=j;
}
}
rez_final=rez_final+minim;
minim=99999;
blank(m);
sir_k[mini2]=-1;
coada.push(mini);
distanta[mini]=0;
bts();
}
rez_final=rez_final+distanta[n];
g<<rez_final;
//cout<<endl;
//for(int i=1;i<=m;i++)
//cout<<distanta[i]<<" ";
return 0;
}