Cod sursa(job #731686)

Utilizator klamathixMihai Calancea klamathix Data 8 aprilie 2012 21:38:01
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1030;

const int INF = 1000 * 1000 * 1000;
#define FORIT(it , v) for(typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)

vector <int> G[maxn] , List[maxn] , C[maxn];
int i , j , n , m , a , b , c , k , dp[maxn][maxn] , counts[maxn][maxn] , cnt;

void ret(int node , int nr) {
	
	if(node == 1) {
		
		if(nr == 1) {
			dp[1][nr] = 0;
			counts[1][nr] = 1;
		}
		
		else {
			dp[1][nr] = INF;
			counts[1][nr] = 0;
		}
		
		return;
	}
	
	int i , minn = INF , ways = 0;
	
	for(i = 0; i < List[node].size(); ++i) {
		int l = List[node][i] , v = G[node][i];
		
		if(l == 0 || (dp[v][l] + C[node][i] == dp[node][nr - 1])) {
			List[node][i]++;
			if(dp[v][List[node][i]] == 0)
				ret(v , List[node][i]);
		}
	}
	
	for(i = 0; i < G[node].size(); ++i) {
		
		int l = List[node][i] , v = G[node][i];
		
		if(dp[v][l] + C[node][i] == minn)
			ways += counts[v][l];
		
		if(dp[v][l] + C[node][i] < minn) {
			ways = counts[v][l];
			minn = dp[v][l] + C[node][i];
		}
	}
	
	dp[node][nr] = minn;
	counts[node][nr] = ways;
}
	

int main()
{
	freopen("pitici.in","r",stdin);
	freopen("pitici.out","w",stdout);
	
	scanf("%d %d %d",&n,&m,&k);
	
	for(i = 1; i <= m; ++i) {
		scanf("%d %d %d",&a,&b,&c);
		//if(a < b)
			//swap(a , b);
		G[b].push_back(a);
		C[b].push_back(c);
		List[b].push_back(0);
	}
	
	for(; k ;) {
		ret(n , ++cnt);
		for(i = 1; i <= counts[n][cnt] && k ; ++i) {
			printf("%d ",dp[n][cnt]);
			k--;
		}
	}
	
	printf("\n");
	
return 0;
}