Cod sursa(job #371215)

Utilizator AndreyPAndrei Poenaru AndreyP Data 4 decembrie 2009 13:27:41
Problema Pitici Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.83 kb
#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;
}