Cod sursa(job #113439)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 10 decembrie 2007 10:04:26
Problema Traseu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<stdio.h>
long long int n,m,infinit,xx,yy,i,cc,c[62][62],pol[62],mm,cb,x[3600],y[3600],cost[3600];
void djikstra();
void muchii();
void swap(long long int i1,long long int i2);
void heapdown(long long int ic,long long int nc);
void fcm();
int main()
{
	FILE *f,*g;f=fopen("traseu.in","r");g=fopen("traseu.out","w");
	fscanf(f,"%lld%lld",&n,&m);
	infinit=2000000000;
	for(i=1;i<=m;i++){fscanf(f,"%lld%lld%lld",&xx,&yy,&cc);c[xx][yy]=cc;pol[xx]--;pol[yy]++;cb+=cc;}
	djikstra();
	muchii();
	for(i=mm/2;i>=1;i--)heapdown(i,mm);
	for(i=mm;i>=1;i--){swap(1,i);heapdown(1,i-1);}
	fcm();
	fprintf(g,"%lld\n",cb);
	fcloseall();
	return 0;
}
void djikstra()
{       long long int ii,jj,kk;
	for(ii=1;ii<=n;ii++)for(jj=1;jj<=n;jj++)if(!c[ii][jj]) c[ii][jj]=infinit;
	for(kk=1;kk<=n;kk++)for(ii=1;ii<=n;ii++)for(jj=1;jj<=n;jj++)if(c[ii][kk]+c[kk][jj]<c[ii][jj])c[ii][jj]=c[ii][kk]+c[kk][jj];
}
void muchii()
{       long long int ii,jj,ss=0,dd=0,s[62],d[62];
	for(ii=1;ii<=n;ii++)
	 { if(pol[ii]>0)
	    { ss++;s[ss]=ii;pol[ii]=-pol[ii];}
	   else
	    if(pol[ii]<0)
	    { dd++;d[dd]=ii;}
	 }
	for(ii=1;ii<=ss;ii++)
	 for(jj=1;jj<=dd;jj++)
	  if(c[s[ii]][d[jj]])
	  { mm++;x[mm]=s[ii];y[mm]=d[jj];cost[mm]=c[s[ii]][d[jj]];}
}
void swap(long long int i1,long long int i2)
{       long long int aux;
	aux=x[i1];x[i1]=x[i2];x[i2]=aux;
	aux=y[i1];y[i1]=y[i2];y[i2]=aux;
	aux=cost[i1];cost[i1]=cost[i2];cost[i2]=aux;
}
void heapdown(long int ic,long int nc)
{
	long long int is,is1;
	is=2*ic;is1=2*ic+1;
	if(is>nc)return;
	if(is<nc) if(cost[is]<cost[is1])is=is1;
	if(cost[ic]<cost[is]){swap(is,ic);heapdown(is,nc);}
}
void fcm()
{       long long int poz=1,pp;
	while(poz<=mm)
	{
	   if(!pol[x[poz]]||!pol[y[poz]])poz++;
	   else
	   { cb+=cost[poz];pp=(pol[x[poz]]<pol[y[poz]])?pol[x[poz]]:pol[y[poz]];
	     pol[x[poz]]-=pp;pol[y[poz]]-=pp;poz++;
	   }
        }
}