Pagini recente » Cod sursa (job #117823) | Cod sursa (job #364768) | Cod sursa (job #2787125) | Cod sursa (job #1327006) | Cod sursa (job #900342)
Cod sursa(job #900342)
#include <stdio.h>
#define MAXINT 0x7FFFFFFF
# include <queue>
# include <vector>
using namespace std;
vector <pair <int, int> > v[37000];
int d[37000],x,i,k,n,m,nod,vecin,cost,a,b,c,tata[37000];
vector <pair <int, int> > ::iterator it;
struct comp
{
bool operator () (const int &x, const int &y)
{
return (d[x]>d[y]);
}
};
priority_queue < int, vector <int> , comp > q;
int main()
{
freopen("catun.in","r",stdin);
freopen("catun.out","w",stdout);
scanf("%d %d %d\n",&n,&m,&k);
for (i=1; i<=n; i++)
d[i]=MAXINT;
for (i=1; i<=k; i++)
{
scanf("%d ",&x);
q.push(x);
d[x]=0;
}
for (i=1; i<=m; i++)
{
scanf("%d %d %d\n",&a,&b,&c);
v[a].push_back(make_pair(c,b));
v[b].push_back(make_pair(c,a));
}
while (!q.empty())
{
nod=q.top();
q.pop();
for (it=v[nod].begin(); it!=v[nod].end(); ++it)
{
vecin=(*it).second;
cost=(*it).first;
if (d[vecin]>d[nod]+cost)
{
d[vecin]=d[nod]+cost;
if (tata[nod]==0) tata[vecin]=nod;
else tata[vecin]=tata[nod];
q.push(vecin);
}
else
if (d[vecin]==d[nod]+cost)
{
if (tata[vecin]>tata[nod])
tata[vecin]=tata[nod];
}
}
}
for (i=1; i<=n; i++)
printf("%d ",tata[i]);
printf("\n");
return 0;
}