Pagini recente » Cod sursa (job #2369162) | Cod sursa (job #578252) | Cod sursa (job #2686149) | Cod sursa (job #1829388) | Cod sursa (job #935018)
Cod sursa(job #935018)
#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;
}