Cod sursa(job #677390)

Utilizator raduiris94Alexa Radu raduiris94 Data 10 februarie 2012 08:53:41
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<cstdio>
#define DN 2005
#define CIC 99999999
int n, m, d[DN], ck[DN], k, mink=CIC, maxk=0; bool viz[DN];
FILE *f=fopen("ubuntzei.in", "r");
FILE *g=fopen("ubuntzei.out", "w");
struct graf
{
	int nod1, nod2, c;
	graf *urm;
}*a[DN];
void NO_TO_ACTA()
{
	fscanf(f, "%d%d", &n, &m);
	fscanf(f, "%d", &k);
	for(int i=1; i<=k; ++i)
		fscanf(f, "%d", &ck[i]);
	for(int i=2; i<=n; ++i)
		d[i]=CIC;
	for(int i=1; i<=m; ++i)
	{
		int x, y, c;
		fscanf(f, "%d%d%d", &x, &y, &c);
		graf *q = new graf;
		q->nod1=x;
		q->nod2=y;
		q->c=c;
		q->urm=a[1];
		a[1]=q;
		if(x==1)
			d[y]=c;
	}
}
int main()
{
	NO_TO_ACTA();
	bool ok=1, ok2=1; int cont;
	while(ok)
	{
		graf *q;
		q=a[1]; ok=0; cont=0;
		while(q!=NULL)
		{
			if(ok==1)
			{
				if(mink>d[q->nod1]+q->c)
				{
					d[q->nod2]=d[q->nod1]+q->c; 
					ok=1;
					cont=cont+q->c;
					viz[q->nod1]=1;
				}
			}
			else
			{
				if(d[q->nod1]+q->c>maxk)
				{
					d[q->nod2]=d[q->nod1]+q->c; 
					ok=1;
					cont=cont+q->c;
					viz[q->nod1]=1;
				}
			}
			q=q->urm;
		}
		if(cont<mink)
			mink=cont;
		ok2=1;
		for(int i=1; i<=k; ++i)
		{
			if(viz[ck[i]]==1)
				viz[ck[i]]=0;
			else
			{
				ok2=0;
				viz[ck[i]]=0;
			}
		}
		if(ok2==0)
		{
			maxk=mink;
			mink=CIC;
		}
	}
	if(d[n]!=CIC)
		fprintf(g, "%d ", d[n]);
	else
		fprintf(g, "0 ");
}