Pagini recente » Cod sursa (job #2499116) | Borderou de evaluare (job #381567) | Cod sursa (job #1948647) | Cod sursa (job #1126060) | Cod sursa (job #1733716)
#include <cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define inf 2147483647
using namespace std;
int n,m,k;
int c[36003],dmin[36003],dminp[36003],cet[36003];
vector<int>graf[36003];
vector<int>costuri[36003];
queue<int>St;
void dijkstra(int nod)
{
int sz,x1,x2,cost;
for(int i=1;i<=n;i++)
dmin[i]=inf;
dmin[nod]=0;
St.push(nod);
while(!St.empty())
{
x1=St.front();
St.pop();
sz=graf[x1].size();
for(int j=0;j<sz;j++)
{
x2=graf[x1][j];
cost=costuri[x1][j];
if(dmin[x2]>dmin[x1]+cost)
{
dmin[x2]=dmin[x1]+cost;
St.push(x2);
}
}
}
}
int main()
{
freopen("catun.in","r",stdin);
freopen("catun.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=k;i++)
scanf("%d",&c[i]);
for(int i=1,x,y,d;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&d);
graf[x].push_back(y);
costuri[x].push_back(d);
graf[y].push_back(x);
costuri[y].push_back(d);
}
dijkstra(c[1]);
for(int i=1;i<=n;i++)
{
dminp[i]=dmin[i];
if(dminp[i]>0&&dminp[i]<inf)
cet[i]=c[1];
}
for(int i=2;i<=k;i++)
{
memset(dmin,0,sizeof(dmin));
dijkstra(c[i]);
for(int j=1;j<=n;j++)
if(dmin[j]==0)cet[j]=0;
else if(dmin[j]<dminp[j])dminp[j]=dmin[j],cet[j]=c[i];
}
for(int i=1;i<=n;i++)
printf("%d ",cet[i]);
return 0;
}