Cod sursa(job #78167)

Utilizator blasterzMircea Dima blasterz Data 15 august 2007 19:11:13
Problema Pitici Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <algorithm>
#include <multiset.h>
#include <set>
#include <map>
#define maxn 1024
#define pb push_back
vector<int> a[maxn];
int x[maxn][maxn];
int n, m, K;
int sorted[maxn], ns;
bool viz[maxn];
int d[maxn];
map<int, int>di[maxn];
//int sol[maxn];
void read()
{
	freopen("pitici.in","r",stdin);
	scanf("%d %d %d\n", &n, &m, &K);
	int p, q, c;
	while(m--)
	{
		scanf("%d %d %d\n", &p, &q, &c);
		a[p].pb(q);
		
		x[p][q]=c;
	}
}

void dfs(int nd)
{
	viz[nd]=1;
	vector<int>::iterator i;
	for(i=a[nd].begin();i!=a[nd].end();++i)
		if(x[nd][*i] && !viz[*i])
			dfs(*i);
	sorted[++ns]=nd;
}

void dist()
{
	int i,t;
	vector<int>::iterator j;
	map<int,int>::iterator k;
	memset(d, 0x3f3f3f3f, sizeof(d));
	d[1]=0;
	i=sorted[1];
	for(j=a[i].begin();j!=a[i].end();++j)
	{
		++di[*j][d[i]+x[i][*j]];
		if(d[i]+x[i][*j]<d[*j])
			d[*j]=d[i]+x[i][*j];
	}
	
	for(t=2;t<=n;++t)
	{
		i=sorted[t];
		for(j=a[i].begin();j!=a[i].end();++j)
		{
			for(k=di[i].begin();k!=di[i].end();++k)
			++di[*j][(k->first+x[i][*j])];
			//di[*j].pb(d[i]+x[i][*j]);
			if(d[i]+x[i][*j]<d[*j])
				d[*j]=d[i]+x[i][*j];
			
		}
	}
	//sort(di[n].begin(),di[n].end());
	int nr=0,p;
	for(k=di[n].begin();k!=di[n].end() && nr<K;++k)
		for(p=k->second;p && nr<K;--p) printf("%d ", k->first), ++nr;//printf("%d  %d\n", k->first, k->second);
	printf("\n");
	
}
int main()
{
	freopen("pitici.out","w",stdout);
	read();
	dfs(1);
	reverse(sorted+1, sorted+n+1);
	//for(int i=1;i<=n;++i) printf("%d ", sorted[i]);
	//printf("\n");
	dist();
	//for(int i=1;i<=n;++i) printf("%d ", d[i]);
	//printf("\n");
	
	//printf("\n\n");
	int i, j;
//	for(i=1;i<=n;++i)
	//{
		//printf("%d ::", i);
	//	for(j=0;j<di[i].size();++j)printf("%d ", di[i][j]);
	//	printf("\n");
//	}
	
	return 0;
}