Pagini recente » Cod sursa (job #2075624) | Cod sursa (job #1685151) | Cod sursa (job #2287357) | Cod sursa (job #73532) | Cod sursa (job #161028)
Cod sursa(job #161028)
/* N*K*logN */
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>
using namespace std;
int i,j,n,m,k;
vector<pair<int,int> > C[1024];
int __min[1024][1024];
int T[1024];
pair<int,int> heap[1024];
int pus[1024];
vector <int> ord;
void readdata(){
FILE *f=fopen ("pitici.in","r");
fscanf (f,"%d%d%d",&n,&m,&k);
for (i=1;i<=m;i++){
int a,b,c;
fscanf (f,"%d%d%d",&a,&b,&c);
C[b].push_back(make_pair(a,c));
}
}
void df(int x){
pus[x]=1;
int i;
for (i=0;i<C[x].size();i++)
if (!pus[C[x][i].first]) df(C[x][i].first);
ord.push_back(x);
}
int MIN(int a,int b){
int ca=(a<=m)?__min[heap[a].first][T[heap[a].first]]+heap[a].second:1000000000;
int cb=(b<=m)?__min[heap[b].first][T[heap[b].first]]+heap[b].second:1000000000;
if (ca<cb) return a;
return b;
}
void swap(int x,int y){
pair<int,int>P;
P=heap[x];
heap[x]=heap[y];
heap[y]=P;
}
void heapup(int i){
if (i!=1){
if (MIN(i,i/2)==i) swap(i,i/2),heapup(i/2);
}
}
void heapdown(int i){
int k=MIN(i*2,i*2+1);
if (MIN(k,i)!=i) swap(i,k),heapdown(k);
}
void solve()
{
for (i=n;i>0;i--)
if (!pus[i]) df(i);
memset(pus,0,sizeof(pus));
pus[1]=1;
memset(__min,1,sizeof(__min));
__min[1][1]=0;
for (i=1;i<n;i++){
for (j=1;j<=n;j++)
T[j]=1;
int nod=ord[i];
m=0;
for (int x=0;x<C[nod].size();x++){
m++;
heap[m].first=C[nod][x].first;
heap[m].second=C[nod][x].second;
heapup(m);
}
for (;m&&pus[nod]<=k;){
__min[nod][ ++pus[nod] ]=__min[heap[1].first][T[heap[1].first]++]+heap[1].second;
if (T[heap[1].first]<=pus[heap[1].first]) heapdown(1);
else swap(1,m),m--,heapdown(1);
}
}
}
void writedata(){
FILE *f=fopen ("pitici.out","w");
if (pus[n]<k) printf ("Prea putine drumuri!!");
for (i=1;i<k;i++)
fprintf (f,"%d ",__min[n][i]);
fprintf (f,"%d\n",__min[n][k]);
fclose (f);
}
int main()
{
readdata();
solve();
writedata();
return 0;
}