Cod sursa(job #1110807)

Utilizator span7aRazvan span7a Data 18 februarie 2014 13:32:18
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
//toate permutarile ale elementelor impare
// Atilla si regele : un cal si un rege se afla pe o tabla de sah. UNele campuri sunt arse. Pozitiile lor sunt cunoscute . Calul nu poate calca pe campurile arse iar orice miscare a calcului face ca respectivul camp sa fie ars. Aflati daca exista o succesiune de mutari permise prin care calul sa ajung ala rege si sa refina pe pozitia initiala .Pozitia calului si pozitia regelui sunt considerate nearse
#include<fstream>
#define M 2000000000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

struct nod
{
    int inf;
    int c;
    nod * leg;
};
typedef nod* PNod;
PNod L[50001];
int q[800000],cost[50001],n,m,nr[50001];
void add(int a,int b,int costi)
{
    PNod p=new nod;
    p->inf=b;
    p->c=costi;
    p->leg=L[a];
    L[a]=p;
}
void bellford()
{

     int inc=1,sf=1,ok=0,i;nr[1]++;
    while(inc<=sf&&ok==0)
    {
        for(PNod p=L[q[inc]];p;p=p->leg)
            if(cost[p->inf]>cost[q[inc]]+p->c)
            {
                cost[p->inf]=cost[q[inc]]+p->c;
                sf++;
                q[sf]=p->inf;nr[p->inf]++;
                if(nr[p->inf]>n)
                  {
                      g<<"Ciclu negativ!";
                     return;
                  }

            }
        inc++;
    }
    if(ok==0)
        for(i=2;i<=n;i++)
            g<<cost[i]<<" ";

}
int main()
{
    int a,b,costi,i;
    f>>n>>m;
    for(i=1;i<=m;i++)
      {
           f>>a>>b>>costi;
        add(a,b,costi);
      }
        for(i=2;i<=n;i++)
            cost[i]=M;
    q[1]=1;
    bellford();
    return 0;
}