Pagini recente » Cod sursa (job #1229960) | Cod sursa (job #2636337) | Cod sursa (job #2427120) | Cod sursa (job #2402329) | Cod sursa (job #78190)
Cod sursa(job #78190)
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, map<int, int> > di;
multiset<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;
multiset<int>::iterator k, aux;
memset(d, 0x3f3f3f3f, sizeof(d));
d[1]=0;
i=sorted[1];
for(j=a[i].begin();j!=a[i].end();++j)
{
di[*j].insert(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].insert((*k+x[i][*j]));//+=k->second;
//while(di[*j].size()>K)
if(di[*j].size()>K){aux=di[*j].end(); --aux; di[*j].erase(aux);}
} //di[*j].pb(d[i]+x[i][*j]);
if(d[i]+x[i][*j]<d[*j])
d[*j]=d[i]+x[i][*j];
}
if(i!=n)di[i].clear();
}
//sort(di[n].begin(),di[n].end());
int nr=0,p;
for(k=di[n].begin();k!=di[n].end();++k) printf("%d ", *k);
// 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;
}