Cod sursa(job #27800)

Utilizator alboiAlboi Sandru Petru alboi Data 7 martie 2007 09:21:34
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
using namespace std ;
 
#define pinf 1.e20
#define max 1500


ofstream g("dmin.out");

double long a[max][max],b[max][max];
float d[max],min1;
int s[max],st[max],n,m,sos,k,nr;

void citire_m();
void minim();
void dantzig();
void afisare_drum(int k);

int main()
{int i,j;
 citire_m();
 for(int t=2;t<=n;t++)
    {
     nr=0;
     sos=t;
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
	if(i==j)
	   b[i][j]=0;
	else
	   b[i][j]=pinf;

     for(i=1;i<=n;i++)
	 d[i]=s[i]=st[i]=0;
     s[1]=1;
     d[1]=0;
     dantzig();
     for(i=1;i<=n;i++)
	 s[i]=0;
     s[1]=1;
     st[1]=1;
     afisare_drum(2);
     g<<nr<<" ";
    }
 g.close();
 return 0;
}
void citire_m()
{ int i,j,k;
  float c;
  ifstream f("dmin.in");
  f>>n>>m;
  for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	 if(i==j)a[i][j]=0;
	 else a[i][j]=pinf;
  for( k=1;k<=m;k++)
       { f>>i>>j>>c;
	 a[i][j]=c;
       }
 f.close();
}
void minim()
{int i,j;
 min1=pinf;
 for(i=1;i<=n;i++)
     for(j=1;j<=n;j++)
	if(s[i] && !s[j])
	  if(min1>d[i]+a[i][j])
		{min1=d[i]+a[i][j];
		 k=j;
		}
}
void dantzig()
{ int i,j;
  for(i=1;i<=n-1;i++)
   { minim();
     if(min1<pinf)
      { s[k]=1;
	d[k]=min1;
	for(j=1;j<=n;j++)
	 if(s[j] && d[j]+a[j][k]==min1)
	   b[j][k]=a[j][k];
     }
  }
}
void afisare_drum(int k)
{int i,j;
 for(i=1;i<=n;i++)
    if(b[st[k-1]][i]<pinf && !s[i])
       if(i!=sos)
	{ s[i]=1;
	  st[k]=i;
	  afisare_drum(k+1);
	  s[i]=0;
	}
	else
	 {
	 nr++;
	 }


}