Cod sursa(job #935018)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 1 aprilie 2013 10:39:06
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include <fstream>
#include <vector>
   
using namespace std;
   
ifstream f("ciclu.in");
ofstream g("ciclu.out");
   
const int maxn = 1003;
   
long long num_vertices, num_edges;
vector< pair<long int,long int> > graph[maxn];
   
void Read()
{
    long long a,b,c,i;
   
    f>>num_vertices>>num_edges;
   
    for(i=1;i<=num_edges;i++)
    {
        f>>a>>b>>c;
        graph[a].push_back(make_pair(b,c));
    }
  
    for(i=1;i<=num_vertices;i++)
        graph[0].push_back(make_pair(i,0));
  
    num_vertices++;
}
   
long long BellmanFord(long double minus)
{
    long long ok = 1, visited = 0, i, j, tovisit, vecin,tovisit_size=0;
   
	vector<long double> to_visit, is_visited, dist;
	is_visited.resize(num_vertices+1), dist.resize(num_vertices+1);
   
    to_visit.push_back(0);
    is_visited[0] = 1;
    dist[0] = 0;
    tovisit_size = to_visit.size();
    while(visited <= num_vertices && ok)
    {
        ok = 0;
        for(i = 0; i < to_visit.size(); i++)
        {
            tovisit = to_visit[i];
            for(j = 0; j<graph[tovisit].size(); j++)
            {
                vecin = graph[tovisit][j].first;
                if(dist[vecin] > dist[tovisit] + graph[tovisit][j].second - minus) 
                {
                    dist[vecin] = dist[tovisit] + graph[tovisit][j].second - minus;
   
                    if(!is_visited[vecin])
                        to_visit.push_back(vecin), is_visited[vecin] = 1;
   
                    ok = 1;
                }
            }
        }
   
        visited++;
    }
   
    to_visit.clear();
    return visited;
}
   
void BinSearch(long double left, long double right)
{
    if(right-left < 0.1)
    {
        long long k = left*100;
        long double show = (double)k/100;
        g<<show<<'\n';
    }
    else
    {
        long double middle = (left+right)/2;
        long double BFord = BellmanFord(middle);
   
        if(BFord > num_vertices-1)
            BinSearch(left,middle);
        else
            if(BFord <= num_vertices-1)
                BinSearch(middle+0.1 , right);
    }
}
   
int main()
{
    Read();
    BinSearch(0.00, 20000.00);
   
    return 0;
}