Cod sursa(job #172803)

Utilizator andrei.12Andrei Parvu andrei.12 Data 6 aprilie 2008 19:32:38
Problema Pitici Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<stdio.h>
#include<vector>
#include<queue>

using namespace std;

#define lg 1021
#define pb push_back

int n, m, k, x, y, c, nr[lg], nr2[lg], nod, nxt, i, j, fiu, lst[lg][lg], q[lg], cnt[lg], vct[lg];
vector <int> v[lg];
bool fst[lg];
typedef pair<int, int> graf;
vector <graf> v2[lg];
struct data{
	int v, i;
};
data vvs, mn;

void df(int nod){
	fst[nod] = 1;
	for (int i = 0; i < nr[nod]; i ++)
		if (!fst[v[nod][i]])
			df(v[nod][i]);

	q[++q[0]] = nod;
}
class mmc{
	public:
		bool operator()(data jos, data sus){
			return sus.v < jos.v;
		}
};
int main()
{
	freopen("pitici.in", "rt", stdin);
	freopen("pitici.out", "wt", stdout);

	scanf("%d%d%d", &n, &m, &k);
	for (i = 1; i <= m; i ++){
		scanf("%d%d%d", &x, &y, &c);

		nr[x] ++;
		v[x].pb(y);

		nr2[y] ++;
		v2[y].pb(graf(x, c));
	}
	/*
	for (i = 1; i <= n; i ++){
		for (j = 0; j < nr2[i]; j ++)
			printf("%d %d   ", v2[i][j].first, v2[i][j].second);
		printf("\n");
	}
	*/
	df(1);

	int x1 = 1, x2 = n;
	while (x1 < x2){
		swap(q[x1], q[x2]);
		x1 ++, x2 --;
	}

	lst[1][0] = 1;
	for (i = 2; i <= n; i ++){
		nod = q[i];
		
		priority_queue< data, vector<data>, mmc> hp;

		for (fiu = 0; fiu < nr2[nod]; fiu ++){
			int nxt = v2[nod][fiu].first;
			
			cnt[nxt] ++;
			vvs.v = lst[nxt][1] + v2[nod][fiu].second, vvs.i = nxt;
			hp.push(vvs);
			vct[nxt] = v2[nod][fiu].second;
		}

		for (j = 1; !hp.empty() && j <= k; j ++){
			mn = hp.top(), hp.pop();
			/*
			if (nod == 9){
				printf("am scos %d %d\n", mn.v, mn.i);
			}
			*/

			lst[nod][++lst[nod][0]] = mn.v;
			
			cnt[mn.i] ++;
			if (cnt[mn.i] <= lst[mn.i][0]){
				vvs.v = lst[mn.i][cnt[mn.i]] + vct[mn.i], vvs.i = mn.i;
				/*
				if (nod == 9)
					printf("%d %d\n", lst[mn.i][cnt[mn.i]], vct[mn.i]);
				*/
				hp.push(vvs);
			}
		}
	}
	/*
	for (i = 1; i <= n; i ++){
		nod = q[i];

		printf("pentru nodul %d [lungime %d]:\t", nod, lst[nod][0]);
		for (j = 1; j <= k; j ++)
			printf("%d ", lst[nod][j]);
		printf("\n");
	}
	*/
	for (i = 1; i <= k; i ++)
		printf("%d ", lst[n][i]);
	printf("\n");

	return 0;
}