<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem floyd_warshall</title>
<link>https://forum.pasja-informatyki.pl/tag/floyd_warshall</link>
<description>Powered by Question2Answer</description>
<item>
<title>Cykl o największej średniej wartości</title>
<link>https://forum.pasja-informatyki.pl/588573/cykl-o-najwiekszej-sredniej-wartosci</link>
<description>

&lt;p&gt;Cześć.&lt;/p&gt;



&lt;p&gt;Próbuję rozwiązać takie zadanie: &lt;a href=&quot;https://szkopul.edu.pl/problemset/problem/-xO_ABE0lLfiSnSd7Mvvrblx/site/?key=statement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://szkopul.edu.pl/problemset/problem/-xO_ABE0lLfiSnSd7Mvvrblx/site/?key=statement&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Mam dany graf skierowany, ważony i chcę znaleźć cykl o największej średniej wartości wag na krawędziach. W książce pisze, żeby wynik wyszukać binarnie, jak sprawdzamy czy da się ułożyć wartość x, to odejmujemy od wagi na każdej krawędzi x i sprawdzamy za pomocą algorytmu Belmana Forda / Floyda Warshalla czy istnieje cykl o sumie &amp;gt;= 0. Wszystko jest jasne, ale mam pewien problem. Umiem za pomocą tych algorytmów sprawdzić czy istnieje cykl o sumie &amp;gt; 0, ale nie umiem sprawdzić, czy istnieje cykl o sumie = 0. Jak ktoś ma jakiś pomysł jak sprawdzić, czy istnieje w grafie cykl o sumie równej 0, to byłbym wdzięczny za podpowiedź.&lt;/p&gt;



&lt;p&gt;Mam taki kod, dostaje 60pkt, właśnie przez to = 0:&lt;/p&gt;



&lt;pre class=&quot;brush:cpp;&quot;&gt;
#include&amp;lt;bits/stdc++.h&amp;gt;
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(a,b) for (int a = 0; a &amp;lt; (b); ++a)
#define pb push_back
#define all(t) t.begin(), t.end()

struct Krawedz
{
	int a,b,c;
};

const int MAXN = 105, INF = 1e9+50;
int n = 0, m = 0, a = 0, b = 0, c = 0;
ld poczatek = 0, koniec = 1e8+20, srodek = 0, eps = 0.0001;
vector&amp;lt;Krawedz&amp;gt; krawedzie;
ld dist[MAXN];

inline bool check_more_zero(ld x) // czy po odjeciu od kazdej krawedzi x, istnieje cykl o sumie &amp;gt; 0
{
	for(int i = 1; i &amp;lt;= n; ++i) dist[i] = (ld)INF;
	dist[1] = 0;
	for(int step = 1; step &amp;lt;= n; ++step)
	{
		bool czy = false;
		for(auto y : krawedzie)
		{
			ld odl = (ld)dist[y.a] + -((ld)y.c - x);
			if(odl &amp;lt; dist[y.b])
			{
				dist[y.b] = odl, czy = true;
			}
		}
		if(czy and step == n) return true;
	}
	return false;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
	rep(i,m)
	{
		cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c;
		krawedzie.pb({a,b,c});
	}

	while(koniec - poczatek &amp;gt; eps)
	{
		srodek = (poczatek + koniec) / (ld)2;
		if(check_more_zero(srodek)) poczatek = srodek;
		else koniec = srodek;
	}
	cout &amp;lt;&amp;lt; fixed &amp;lt;&amp;lt; setprecision(4) &amp;lt;&amp;lt; poczatek &amp;lt;&amp;lt; '\n';

	return 0;
}&lt;/pre&gt;



&lt;p&gt;Z góry dziękuję za pomoc i poświęcony czas.&lt;/p&gt;</description>
<category>Algorytmy</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/588573/cykl-o-najwiekszej-sredniej-wartosci</guid>
<pubDate>Fri, 06 Oct 2023 14:47:26 +0000</pubDate>
</item>
</channel>
</rss>