Pagini recente » Cod sursa (job #3281096) | Cod sursa (job #136922) | Cod sursa (job #3230863) | Cod sursa (job #3122546) | Cod sursa (job #91019)
Cod sursa(job #91019)
#include<stdio.h>
#define Nm (1<<10)
#define Inf 1000000000
#define dist(x) (Dmin[x][I[x]]+C[x][node])
int C[Nm][Nm],Dmin[Nm][Nm],I[Nm],PostOrd[Nm],Viz[Nm],H[Nm],n,k,a,h,node;
void read()
{
int m,x,y,c;
freopen("pitici.in","r",stdin);
scanf("%d%d%d",&n,&m,&k);
while(m--)
{
scanf("%d%d%d",&x,&y,&c);
C[x][y]=c; C[y][x]=-c;
}
}
void DFS(int x)
{
int i;
Viz[x]=1;
for(i=1;i<=n;++i)
if(C[x][i]>0 && !Viz[i])
DFS(i);
PostOrd[++a]=x;
}
void sink(int x)
{
int v=H[x],son=x<<1;
while(son<=h)
{
if(son<h && dist(H[son|1])<dist(H[son]))
son|=1;
if(dist(v)<=dist(H[son]))
break;
H[x]=H[son]; x=son; son<<=1;
}
H[x]=v;
}
void solve()
{
int i,j;
DFS(1);
Dmin[1][0]=0; Dmin[1][1]=Inf;
for(i=a-1;i;--i)
{
node=PostOrd[i]; h=0;
for(j=1;j<=n;++j)
if(C[node][j]<0)
{
H[++h]=j;
I[j]=0;
}
for(j=h>>1;j;--j)
sink(j);
for(j=0;j<k;++j)
{
Dmin[node][j]=dist(H[1]);
if(Dmin[node][j]>=Inf)
break;
++I[H[1]];
sink(1);
}
Dmin[node][j]=Inf;
}
}
void write()
{
int i;
freopen("pitici.out","w",stdout);
for(i=0;i<k-1;++i)
printf("%d ",Dmin[n][i]);
printf("%d\n",Dmin[n][i]);
}
int main()
{
read();
solve();
write();
return 0;
}