Cod sursa(job #203814)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 20 august 2008 01:37:02
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.36 kb
#include <vector>
#include <cstdio>
#include <string>
#define N 50003
#define INF 0x3f3f3f3f
#define st(x) 2*(x)
#define dr(x) st(x)+1
#define pr(x) (x)/2
using namespace std;
struct nod{long nod, cost;};
vector<vector<nod> > v;
vector<int> s;
vector<long> heap,cost;//cu noduri
vector<long>ph;//pozitia in heap
FILE *aux;
void adauga(long a,long b,long c)
{nod x={b,c};
 v[a].push_back(x);
}

void relax(long u)
{vector<nod>::iterator p;
 long i,aux;
 for (p=v[u].begin();p!=v[u].end();++p)
 {if(cost[p->nod]>cost[u]+p->cost)
  {cost[p->nod]=cost[u]+p->cost;
   //percolate
   for (i=ph[p->nod];pr(i);i=pr(i))
   {if(cost[heap[i]]<cost[heap[pr(i)]])
    {aux=heap[i];heap[i]=heap[pr(i)];heap[pr(i)]=aux;
     ph[heap[i]]=i;ph[heap[pr(i)]]=pr(i);
    }
   }
  }
 }
}
void scoate_minim()
{long min,i=0,j,aux;
 heap[1]=*(heap.end()-1);
 ph[heap[1]]=1;
 heap.resize(heap.size()-1);
 
 j=1;
 do
 {i=j;
  min=heap[i];
  if(cost[heap[st(i)]]<cost[min])
  {min=heap[st(i)];j=st(i);}
  if(cost[heap[dr(i)]]<cost[min])
  {min=heap[dr(i)];j=dr(i);}
  if(min!=heap[i])
  {aux=heap[i];
   heap[i]=heap[j];
   heap[j]=aux;
   ph[heap[i]]=ph[i];
   ph[heap[j]]=ph[j];
  }                }
 while(heap[i]!=min);
}
void afisare(long i,long min)
{long j;
fprintf(aux,"%ld %ld \nh: ",i,min);
  for (j=1;j<heap.size();j++){fprintf(aux,"%ld ",heap[j]);}
  fprintf(aux,"\n   1 2 3 4 5 6 7");
  fprintf(aux,"\nb: ");
  for (j=1;j<s.size();j++)
  {if(s[j])
   {fprintf(aux,"1 ");
   }
   else
   {fprintf(aux,"0 ");
   }
  }
  fprintf(aux,"\nc: ");
  for (j=1;j<cost.size();j++)
  {fprintf(aux,"%ld ",cost[j]);
  }
  fprintf(aux,"\n\n");

}
int main ()
{FILE *fin=fopen("dijkstra.in","r");
 FILE *fout=fopen ("dijkstra.out","w");
 aux=fopen("debug.txt","w");
 long n,m,a,b,c,i,min,j;

 fscanf(fin,"%ld%ld",&n,&m);
 v.resize(n+1); s.resize(n+1); heap.resize(n); cost.resize(n+1);ph.resize(n+1);

 vector<long>::iterator q;
 for (q=cost.begin();q!=cost.end();++q){*q=INF;}
 for (i=1;i<heap.size();++i){heap[i]=i+1;ph[i+1]=i;}
 for (i=1;i<=m;i++)
 {fscanf(fin,"%ld%ld%ld",&a,&b,&c);
  adauga(a,b,c);
 }
 cost[1]=0;
// s[1]=true;

 relax(1);
 for (i=1;i<n;i++)
 {
  min=heap[1];
  s[heap[1]]=1;
  afisare(i,min);
  scoate_minim();
  relax(min);



 }
  for (i=2;i<=n;i++)
  {fprintf(fout,"%ld",cost[i]);
  }

 
 return 0;
}