Pagini recente » Cod sursa (job #1543849) | Cod sursa (job #2907985) | Cod sursa (job #14436) | Cod sursa (job #1138473) | Cod sursa (job #731686)
Cod sursa(job #731686)
#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;
}