Pagini recente » Cod sursa (job #1249851) | Cod sursa (job #1722068) | Cod sursa (job #1119334) | Cod sursa (job #2279319) | Cod sursa (job #30385)
Cod sursa(job #30385)
using namespace std;
#include<fstream>
#include<stdio.h>
#define nmax 100002
#define qmax 34
struct nod{int vec,dist;nod* next;};
typedef nod* list;
list a[nmax],aux;
int n,q;
int x[nmax];
char viz[nmax];
int sum[nmax][qmax],nd[nmax][qmax];
int main()
{
//FILE *fin=fopen("caravane.in","r"),
// *fout=fopen("caravane.out","w");
int i,j,k,cst;
//fscanf(fin,"%d%d",&n,&q);
n=100000;
q=32;
for(i=1;i<n;i++)
{
// fscanf(fin,"%d%d%d",&j,&k,&cst);
j=i;
k=i+1;
cst=100;
if(a[j]==NULL)
{
a[j]=new nod;
a[j]->next=NULL;
}
else
{
aux=new nod;
aux->next=a[j];
a[j]=aux;
}
a[j]->vec=k;
a[j]->dist=cst;
if(a[k]==NULL)
{
a[k]=new nod;
a[k]->next=NULL;
}
else
{
aux=new nod;
aux->next=a[k];
a[k]=aux;
}
a[k]->vec=j;
a[k]->dist=cst;
}
//BFS
memset(viz,0,sizeof viz);
int li,lf;
li=lf=1;
x[li]=1;
viz[1]=1;
while(li<=lf)
{
for(aux=a[x[li]];aux;aux=aux->next)
if(viz[aux->vec]==0)
{
viz[aux->vec]=1;
x[++lf]=aux->vec;
}
li++;
}
//completare matrice
memset(sum,0,sizeof sum);
memset(nd,0,sizeof nd);
for(i=1;i<=n;i++)
nd[i][0]=1;
for(i=lf;i;i--)
{
viz[x[i]]=0;
for(aux=a[x[i]];aux;aux=aux->next)
if(viz[aux->vec]==0)
for(j=0;j<q;j++)
{
sum[x[i]][j+1]+=sum[aux->vec][j] + nd[aux->vec][j]*aux->dist;
nd[x[i]][j+1]+=nd[aux->vec][j];
}
}
//solutia
long long sol=0,sol2=0,s1,s2;
for(i=1;i<=n;i++)
{
viz[x[i]]=1;
for(aux=a[x[i]];aux;aux=aux->next)
if(viz[aux->vec]==0)
for(j=1;j<q;j++)
{
s1= (long long) sum[aux->vec][j-1] + nd[aux->vec][j-1]*aux->dist;
s2= (long long) sum[aux->vec][q-j-1] + nd[aux->vec][q-j-1]*aux->dist;
s2= (long long) sum[x[i]][q-j] - s2;
sol+= s1 * (nd[x[i]][q-j]-nd[aux->vec][q-j-1]) +s2;
}
sol2+=(long long)sum[x[i]][q];
}
sol+=sol2<<1;
//fprintf(fout,"%lld\n",sol);
//fclose(fin);
//fclose(fout);
return 0;
}