Pagini recente » Cod sursa (job #229342) | Cod sursa (job #659357) | Cod sursa (job #1061135) | Cod sursa (job #2248685) | Cod sursa (job #253316)
Cod sursa(job #253316)
# include <stdio.h>
# include <vector>
using namespace std;
# define input "pitici.in"
# define output "pitici.out"
# define maxd 1021
# define max 1021
# define minim(a,b) (a<b?a:b)
int a[max][maxd],c[max][max],d[max];
int cost,aux,p;
int n,m,x,y,l,i,k,j,K;
int coada[max],inc[max];
vector < vector < int > > v,v1;
struct ee
{
int a,r;
}h[max];
void heapup(ee a[maxd],int val,int r)
{
a[0].a ++;
a[a[0].a].a = val;
a[a[0].a].r = r;
int pos = a[0].a;
while(pos>1)
{
if(a[pos/2].a > a[pos].a)
{
ee aux = a[pos];
a[pos] = a[pos/2];
a[pos/2] = aux;
pos/=2;
}
else
pos = 1;
}
}
void coboarah(ee a[maxd])
{
int sz = a[0].a;
int p;
p = 1;
while(2*p <= sz)
{
int x = 2*p;
if(x + 1<= sz)
if(a[x].a > a[x+1].a)
x++;
if(a[p].a > a[x].a)
{
ee aux = a[p];
a[p] = a[x];
a[x] = aux;
p = x;
}
else
p = sz;
}
}
int main()
{
freopen(input, "r", stdin);
freopen(output, "w", stdout);
scanf("%d%d%d",&n,&m,&K);
v.resize(n+1);
v1.resize(n+1);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&cost);
c[x][y] = cost;
v[y].push_back(x);
v1[x].push_back(y);
inc[x]++;
}
l = n;
for(i=1;i<=n;i++)
if(!inc[i])
coada[l--] = i;
int st = n;
while(st)
{
i = coada[st];
for(k=0;k<v[i].size();k++)
{
j = v[i][k];
inc[j] --;
if(inc[j] == 0)
coada[l--] = j;
}
st--;
}
a[1][0] = 1;
a[1][1] = 0;
int e;
for(e=2;e<=n;e++)
{
i = coada[e];
h[0].a = 0;
for(j = 0;j < v[i].size();j++)
{
k = v[i][j];
d[k] = 1;
heapup(h,a[k][1] + c[k][i],k);
}
int nr = 0;
while(h[0].a && nr < K)
{
nr++;
ee p = h[1];
a[i][++a[i][0]] = p.a;
if(d[p.r] < a[p.r][0])
{
d[p.r]++;
h[1].a = a[h[1].r][d[p.r]] + c[h[1].r][i];
coboarah(h);
}
else
{
h[1] = h[h[0].a];
h[0].a--;
coboarah(h);
}
}
}
for(i=1;i<=K;i++)
{
printf("%d ",a[n][i]);
}
return 0;
}