Cod sursa(job #769286)

Utilizator GrimpowRadu Andrei Grimpow Data 18 iulie 2012 21:35:26
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>

using namespace std;

int i,j,n,m,k;

vector<pair<int,int> > C[1024];

int __min[1024][1024];
int T[1024];
pair<int,int> heap[1024];
int pus[1024];

vector <int> ord;
void readdata(){
	FILE *f=fopen ("pitici.in","r");
	fscanf (f,"%d%d%d",&n,&m,&k);

	for (i=1;i<=m;i++){
		int a,b,c;
		fscanf (f,"%d%d%d",&a,&b,&c);
		C[b].push_back(make_pair(a,c));
	}
}

void df(int x){
	pus[x]=1;
	int i;

	for (i=0;i<C[x].size();i++)
		if (!pus[C[x][i].first]) df(C[x][i].first);
	ord.push_back(x);
}

int MIN(int a,int b){
	int ca=(a<=m)?__min[heap[a].first][T[heap[a].first]]+heap[a].second:1000000000;
	int cb=(b<=m)?__min[heap[b].first][T[heap[b].first]]+heap[b].second:1000000000;
	if (ca<cb) return a;
	return b;
}

void swap(int x,int y){
	pair<int,int>P;
	P=heap[x];
	heap[x]=heap[y];
	heap[y]=P;
}

void heapup(int i){
	if (i!=1){
		if (MIN(i,i/2)==i) swap(i,i/2),heapup(i/2);
	}
}

void heapdown(int i){
	int k=MIN(i*2,i*2+1);
	if (MIN(k,i)!=i) swap(i,k),heapdown(k);
}

void solve()
{
	for (i=n;i>0;i--)
		if (!pus[i]) df(i);
	memset(pus,0,sizeof(pus));
	pus[1]=1;
	memset(__min,1,sizeof(__min));
	__min[1][1]=0;

	for (i=1;i<n;i++){
		for (j=1;j<=n;j++)
				T[j]=1;
		int nod=ord[i];
		
		m=0;
		
		for (int x=0;x<C[nod].size();x++){
			m++;
			heap[m].first=C[nod][x].first;
			heap[m].second=C[nod][x].second;
			heapup(m);
		}
		
		for (;m&&pus[nod]<=k;){
			__min[nod][ ++pus[nod] ]=__min[heap[1].first][T[heap[1].first]++]+heap[1].second;
			if (T[heap[1].first]<=pus[heap[1].first]) heapdown(1);
			else swap(1,m),m--,heapdown(1);
		}
	}
}

void writedata(){
	FILE *f=fopen ("pitici.out","w");
	if (pus[n]<k) printf ("Prea putine drumuri!!");;
	for (i=1;i<k;i++)
		fprintf (f,"%d ",__min[n][i]);
	fprintf (f,"%d\n",__min[n][k]);
	fclose (f);
}

int main()
{
	readdata();
	solve();
	writedata();

	return 0;
}