Cod sursa(job #403483)

Utilizator APOCALYPTODragos APOCALYPTO Data 24 februarie 2010 23:11:31
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
#define oo 0x3f3f3f3f

#define foreach(v)  for(typeof (v).begin() it=(v).begin();it!=(v).end();it++)
struct nod_
{long long nod;
long long lg;
};
vector<nod_> G[1005];
queue<long long> q;

long long n,m,isin[1005],dist[1005],nr[1005];
long long blmf(long long trai)
{long long u,i,terminat;
for(i=1;i<=n;i++)
  foreach(G[i])
  {it->lg=it->lg - trai;
  }

q.push(1);
isin[1]=1;
nr[1]=1;
dist[0]=1;
terminat=0;
for(i=2;i<=n;i++)
   {nr[i]=isin[i]=0;
   dist[i]=oo;
   }

while(!q.empty()&&!terminat)
{u=q.front();
q.pop();
isin[u]=0;
foreach(G[u])
{
if(dist[u]+it->lg<dist[it->nod])
   {dist[it->nod]=dist[u]+it->lg;
    if(isin[it->nod]==0)
     {q.push(it->nod);
      isin[it->nod]=1;
      nr[it->nod]++;
      if(nr[it->nod]>n)
       {terminat=1;
       }
     }
    }
}
}
for(i=1;i<=n;i++)
  foreach(G[i])
  {it->lg=it->lg + trai;
  }
if(terminat==1)
return 0;
else return 1;
}


long long bs(long long lo,long long up)
{long long m;
if(lo==up)
 {   if(blmf(lo)==1)
    {return lo;}
    else {return lo+1;}
 }
    else
    {m=lo+(up-lo)/2;
    if(blmf(m)==0)
    {return bs(lo,m-1);
    }
    else
    if(blmf(m+1)==1)
    {return bs(m+1,up);
    }
    else
    {return m;}
    }
}




void cit()
{long long i,x,y,z;
    ifstream fin("ciclu.in");
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {fin>>x>>y>>z;
    G[x].push_back((nod_){y,100*z});
    }
    fin.close();
}


int main()
{
    cit();
    ofstream fout("ciclu.out");

    fout<<(float)bs(0,10000000)/100;
    fout.close();
    return 0;
}