Pagini recente » Rating Toni Caia (tonicaia) | Cod sursa (job #28512) | Cod sursa (job #1438429) | Cod sursa (job #2989426) | Cod sursa (job #161455)
Cod sursa(job #161455)
/*
ID: bogdan1
TASK: cowjog
LANG: C++
*/
#include <cstdio>
#include <vector>
#include <set>
using namespace std;
#define MAXN 1024
int N, M, K;
vector< pair<int, int> > con[MAXN], coni[MAXN];
multiset< pair<int, int> > S;
int dN[MAXN];
void insertNew( int nod, int val )
{
if ((int)S.size() < K)
{
S.insert( make_pair(val, nod) );
return;
}
set< pair<int, int> > :: iterator it;
it = S.end(); --it;
if (val < (*it).first)
{
S.erase(it);
S.insert( make_pair(val, nod) );
}
}
int main()
{
freopen("pitici.in", "rt", stdin);
freopen("pitici.out", "wt", stdout);
scanf("%d %d %d", &N, &M, &K);
for (int i = 0; i < M; i++)
{
int x, y, cst;
scanf("%d %d %d", &x, &y, &cst);
con[x].push_back( make_pair(y, cst) );
coni[y].push_back( make_pair(x, cst) );
}
memset( dN, 0x3f, sizeof(dN) );
dN[N] = 0; S.insert( make_pair(0, N) );
for (; !S.empty(); )
{
int i = S.begin() -> second;
S.erase( S.begin() );
vector< pair<int, int> > :: iterator it;
for (it = coni[i].begin(); it != coni[i].end(); it++)
if (dN[i] + (*it).second < dN[ (*it).first ])
{
S.erase( make_pair( dN[ (*it).first ], (*it).first ) );
dN[ (*it).first ] = dN[i] + (*it).second;
S.insert( make_pair( dN[ (*it).first ], (*it).first ) );
}
}
S.clear();
S.insert( make_pair( dN[1], 1 ) );
for (; !S.empty() && K; )
{
set< pair<int, int> > :: iterator sit;
/*for (sit = S.begin(); sit != S.end(); sit++)
{
int i = sit -> second, cst = sit -> first - dN[i];
printf("%d %d + %d -> %d\n", i, cst, dN[i], cst + dN[i]);
}
printf("\n\n");*/
int i = S.begin() -> second, cst = S.begin() -> first - dN[i];
S.erase( S.begin() );
if (i == N)
{
printf("%d ", cst); K--;
continue;
}
vector< pair<int, int> > :: iterator it;
for (it = con[i].begin(); it != con[i].end(); it++)
insertNew( (*it).first, cst + (*it).second + dN[ (*it).first ] );
}
for (; K; K--)
printf("-1\n");
return 0;
}