Pagini recente » Cod sursa (job #787355) | Cod sursa (job #99499) | Cod sursa (job #662305) | Cod sursa (job #1370562) | Cod sursa (job #371215)
Cod sursa(job #371215)
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<bitset>
using namespace std;
#define N 1025
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define pss pair<short,short>
const int inf=2000010;
struct Nod
{
int d;
short nod,cnt;
};
int n,m,k,nh;
int d[N];
bitset<N> viz;
vector< pss > a[N],b[N];
Nod h[N*N];
inline int left_son(int x)
{
return x<<1;
}
inline int right_son(int x)
{
return (x<<1)+1;
}
inline int father(int x)
{
return x>>1;
}
inline void upheap(int k)
{
Nod key=h[k];
int cat=key.d+d[a[key.nod][key.cnt].fs];
int tata=father(k);
while(k>1 && cat<h[tata].d+d[a[h[tata].nod][h[tata].cnt].fs])
{
h[k]=h[tata];
k=tata;
tata=father(tata);
}
h[k]=key;
}
inline void downheap(int k)
{
int son=0,son1;
do
{
son=0;
if(left_son(k)<=nh)
{
son=left_son(k);
son1=son+1;
if(right_son(k)<=nh && h[son1].d+d[a[h[son1].nod][h[son1].cnt].fs]<h[son].d+d[a[h[son].nod][h[son].cnt].fs])
son=son1;
if(h[son].d+d[a[h[son].nod][h[son].cnt].fs]>=h[k].d+d[a[h[k].nod][h[k].cnt].fs])
son=0;
}
if(son)
{
swap(h[k],h[son]);
k=son;
}
}while(son);
}
inline void citire()
{
scanf("%d%d%d",&n,&m,&k);
short x,y,z;
for(int i=0; i<m; ++i)
{
scanf("%hd%hd%hd",&x,&y,&z);
a[x].pb(mp(y,z));
b[y].pb(mp(x,z));
}
}
bool compar(const pss &x,const pss &y)
{
if(d[x.fs]+x.sc<d[y.fs]+y.sc)
return true;
return false;
}
inline void dijkstra()
{
d[n]=0;
for(int i=1; i<n; ++i)
d[i]=inf;
int mina;
short nod;
for(int i=0; i<n; ++i)
{
mina=inf;
for(int j=1; j<=n; ++j)
{
if(viz[j]==0 && d[j]<mina)
{
mina=d[j];
nod=j;
}
}
viz[nod]=1;
for(size_t t=0,lim=b[nod].size(); t<lim; ++t)
{
if(d[b[nod][t].fs]>mina+b[nod][t].sc)
d[b[nod][t].fs]=mina+b[nod][t].sc;
}
}
for(int i=1; i<=n; ++i)
{
if(a[i].size()>1)
sort(a[i].begin(),a[i].end(),compar);
}
}
inline void rezolva()
{
nh=1;
h[1].nod=1;
h[1].cnt=0;
h[1].d=a[1][0].sc;
Nod cine;
short nod,dist;
for(; k; --k)
{
if(nh==0)
exit(4);
cine=h[1];
h[1]=h[nh--];
downheap(1);
printf("%d",cine.d+d[a[cine.nod][cine.cnt].fs]);
if(k!=1)
fputc(' ',stdout);
if(cine.cnt+1<a[cine.nod].size())
{
++nh;
h[nh].nod=cine.nod;
h[nh].cnt=cine.cnt+1;
h[nh].d=cine.d-a[cine.nod][cine.cnt].sc+a[cine.nod][cine.cnt+1].sc;
upheap(nh);
}
nod=a[cine.nod][cine.cnt].fs;
dist=cine.d;
while(nod!=n)
{
if(a[nod].size()>1)
{
++nh;
h[nh].nod=nod;
h[nh].cnt=1;
h[nh].d=dist+a[nod][1].sc;
upheap(nh);
}
dist+=a[nod][0].sc;
nod=a[nod][0].fs;
}
}
fputc('\n',stdout);
}
int main()
{
freopen("pitici.in","r",stdin);
freopen("pitici.out","w",stdout);
citire();
dijkstra();
rezolva();
return 0;
}