Pagini recente » Cod sursa (job #3169492) | Cod sursa (job #2416007) | Cod sursa (job #2608350) | Cod sursa (job #349795) | Cod sursa (job #903581)
Cod sursa(job #903581)
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
vector<int> v[5001],cost[5001];
queue<int> q;
int n,m,k,nroper=0,prieteni[20],dist[5001],lovit[5002],inq[5002], partiale[20][20],distantefinale[20];
void bellman(int start){
int x,i;
q.push(start);
x=start;
nroper++;
dist[start]=0;
lovit[start]=nroper;
while(!q.empty()){
x=q.front();
q.pop();
for(i=0;i<v[x].size();i++){
if(dist[v[x][i]] > dist[x] + cost[x][i] || lovit[v[x][i]]!= nroper){
dist[v[x][i]] = dist[x] + cost[x][i];
lovit[v[x][i]]=nroper;
if(inq[v[x][i]]!=nroper){
q.push(v[x][i]);
inq[v[x][i]]++;
}
}
}
inq[x]=0;
}
distantefinale[nroper]=dist[n];
for(i=1;i<=k;i++)
partiale[nroper][i]=dist[prieteni[i]];
}
int main()
{int i,a,b,c;
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++)
scanf("%d",&prieteni[i]);
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
v[a].push_back(b);
v[b].push_back(a);
cost[a].push_back(c);
cost[b].push_back(c);
}
for(i=2;i<=n;i++)
dist[i]=2000000000;
bellman(1);
if(k==0)
printf("%d",dist[n]);
else
{
for(i=1;i<=k;i++)
bellman(prieteni[i]);
}
return 0;
}