Pagini recente » Cod sursa (job #2104132) | Cod sursa (job #2651141) | preONI 2008 - Clasament general, Clasele 11-12 | Cod sursa (job #984121) | Cod sursa (job #27810)
Cod sursa(job #27810)
#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++;
}
}