Pagini recente » Cod sursa (job #637165) | Cod sursa (job #827120) | Cod sursa (job #2023899) | Cod sursa (job #1072113) | Cod sursa (job #78168)
Cod sursa(job #78168)
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;
//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;
}