Pagini recente » Cod sursa (job #2741281) | Cod sursa (job #1349155) | Cod sursa (job #1901648) | Cod sursa (job #2863582) | Cod sursa (job #2961696)
<html>
<head>
<title>main.cpp</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
.s0 { color: #f9e2af; font-style: italic;}
.s1 { color: #cdd6f4;}
.s2 { color: #a6e3a1;}
.s3 { color: #cba6f7;}
.s4 { color: #cdd6f4;}
.s5 { color: #89dceb;}
.s6 { color: #fab387;}
.s7 { color: #585b70; font-style: italic;}
</style>
</head>
<body bgcolor="#1e1e2e">
<table CELLSPACING=0 CELLPADDING=5 COLS=1 WIDTH="100%" BGCOLOR="#606060" >
<tr><td><center>
<font face="Arial, Helvetica" color="#000000">
main.cpp</font>
</center></td></tr></table>
<pre><span class="s0">#include </span><span class="s2"><bits/stdc++.h></span>
<span class="s3">using namespace </span><span class="s1">std</span><span class="s4">;</span>
<span class="s1">ifstream f</span><span class="s4">(</span><span class="s2">"maxflow.in"</span><span class="s4">);</span>
<span class="s1">ofstream g</span><span class="s4">(</span><span class="s2">"maxflow.out"</span><span class="s4">);</span>
<span class="s1">vector</span><span class="s5"><</span><span class="s1">vector</span><span class="s5"><</span><span class="s3">int</span><span class="s5">>> </span><span class="s1">gr</span><span class="s4">;</span>
<span class="s1">vector</span><span class="s5"><</span><span class="s1">vector</span><span class="s5"><</span><span class="s3">int</span><span class="s5">>> </span><span class="s1">flow</span><span class="s4">;</span>
<span class="s3">bool </span><span class="s1">bfs</span><span class="s4">(</span><span class="s3">int </span><span class="s1">n</span><span class="s4">, </span><span class="s3">int </span><span class="s1">src</span><span class="s4">, </span><span class="s3">int </span><span class="s1">dest</span><span class="s4">, </span><span class="s3">int </span><span class="s1">father</span><span class="s4">[])</span>
<span class="s4">{</span>
<span class="s3">bool </span><span class="s1">visited</span><span class="s4">[</span><span class="s1">n</span><span class="s5">+</span><span class="s6">1</span><span class="s4">];</span>
<span class="s1">memset</span><span class="s4">(</span><span class="s1">visited</span><span class="s4">, </span><span class="s6">0</span><span class="s4">, </span><span class="s3">sizeof</span><span class="s4">(</span><span class="s1">visited</span><span class="s4">));</span>
<span class="s1">memset</span><span class="s4">(</span><span class="s1">father</span><span class="s4">, </span><span class="s6">0</span><span class="s4">, </span><span class="s3">sizeof</span><span class="s4">(</span><span class="s1">father</span><span class="s4">));</span>
<span class="s1">queue</span><span class="s5"><</span><span class="s3">int</span><span class="s5">> </span><span class="s1">vertexes</span><span class="s4">;</span>
<span class="s1">vertexes</span><span class="s4">.</span><span class="s1">push</span><span class="s4">(</span><span class="s1">src</span><span class="s4">);</span>
<span class="s3">while</span><span class="s4">(</span><span class="s5">!</span><span class="s1">vertexes</span><span class="s4">.</span><span class="s1">empty</span><span class="s4">())</span>
<span class="s4">{</span>
<span class="s3">int </span><span class="s1">currentNode </span><span class="s5">= </span><span class="s1">vertexes</span><span class="s4">.</span><span class="s1">front</span><span class="s4">();</span>
<span class="s1">vertexes</span><span class="s4">.</span><span class="s1">pop</span><span class="s4">();</span>
<span class="s3">for</span><span class="s4">(</span><span class="s3">auto </span><span class="s1">extr2</span><span class="s5">: </span><span class="s1">gr</span><span class="s4">[</span><span class="s1">currentNode</span><span class="s4">])</span>
<span class="s4">{</span>
<span class="s3">if</span><span class="s4">(</span><span class="s1">extr2</span><span class="s5">!=</span><span class="s6">0</span><span class="s4">)</span>
<span class="s3">if</span><span class="s4">(</span><span class="s5">!</span><span class="s1">visited</span><span class="s4">[</span><span class="s1">extr2</span><span class="s4">] </span><span class="s3">and </span><span class="s1">flow</span><span class="s4">[</span><span class="s1">currentNode</span><span class="s4">][</span><span class="s1">extr2</span><span class="s4">]</span><span class="s5">></span><span class="s6">0</span><span class="s4">) </span><span class="s7">//daca nu am vizitat nodul extr2</span>
<span class="s7">//si capacitatea muchiei formata din nodul curent si extremitatea 2 permite trecerea flow-ului</span>
<span class="s4">{</span>
<span class="s1">father</span><span class="s4">[</span><span class="s1">extr2</span><span class="s4">] </span><span class="s5">= </span><span class="s1">currentNode</span><span class="s4">;</span>
<span class="s3">if</span><span class="s4">(</span><span class="s1">extr2 </span><span class="s5">== </span><span class="s1">dest</span><span class="s4">)</span>
<span class="s3">return true</span><span class="s4">;</span>
<span class="s1">vertexes</span><span class="s4">.</span><span class="s1">push</span><span class="s4">(</span><span class="s1">extr2</span><span class="s4">);</span>
<span class="s1">visited</span><span class="s4">[</span><span class="s1">extr2</span><span class="s4">] </span><span class="s5">= </span><span class="s3">true</span><span class="s4">;</span>
<span class="s4">}</span>
<span class="s4">}</span>
<span class="s4">}</span>
<span class="s3">return false</span><span class="s4">; </span><span class="s7">//nu am gasit un drum de la sursa la destinatie, inseamna nu mai am drumuri si ca am ajuns la flux maxim</span>
<span class="s4">}</span>
<span class="s3">int </span><span class="s1">fordFulkerson</span><span class="s4">(</span><span class="s3">int </span><span class="s1">n</span><span class="s4">, </span><span class="s3">int </span><span class="s1">src</span><span class="s4">, </span><span class="s3">int </span><span class="s1">dest</span><span class="s4">)</span>
<span class="s4">{</span>
<span class="s3">int </span><span class="s1">u</span><span class="s4">, </span><span class="s1">v</span><span class="s4">, </span><span class="s1">max_flow_for_route</span><span class="s4">, </span><span class="s1">currentNode</span><span class="s4">;</span>
<span class="s3">int </span><span class="s1">father</span><span class="s4">[</span><span class="s1">n</span><span class="s5">+</span><span class="s6">1</span><span class="s4">];</span>
<span class="s1">memset</span><span class="s4">(</span><span class="s1">father</span><span class="s4">, </span><span class="s6">0</span><span class="s4">, </span><span class="s3">sizeof</span><span class="s4">(</span><span class="s1">father</span><span class="s4">));</span>
<span class="s3">int </span><span class="s1">srcAux </span><span class="s5">= </span><span class="s1">src</span><span class="s4">, </span><span class="s1">destAux </span><span class="s5">= </span><span class="s1">dest</span><span class="s4">, </span><span class="s1">fNode</span><span class="s4">, </span><span class="s1">finalFlow </span><span class="s5">= </span><span class="s6">0</span><span class="s4">;</span>
<span class="s3">while</span><span class="s4">(</span><span class="s1">bfs</span><span class="s4">(</span><span class="s1">n</span><span class="s4">, </span><span class="s1">src</span><span class="s4">, </span><span class="s1">dest</span><span class="s4">, </span><span class="s1">father</span><span class="s4">))</span>
<span class="s4">{</span>
<span class="s1">max_flow_for_route </span><span class="s5">= </span><span class="s1">INT_MAX</span><span class="s4">;</span>
<span class="s1">srcAux </span><span class="s5">= </span><span class="s1">src</span><span class="s4">;</span>
<span class="s1">destAux </span><span class="s5">= </span><span class="s1">dest</span><span class="s4">;</span>
<span class="s3">while</span><span class="s4">(</span><span class="s1">destAux</span><span class="s5">!=</span><span class="s1">srcAux</span><span class="s4">)</span>
<span class="s4">{</span>
<span class="s7">//calculez flow-ul maxim de transmis pe drumul gasit de bfs</span>
<span class="s7">//g<<father[destAux]<<' '<<destAux<<" "<<flow[father[destAux]][destAux]<<endl;</span>
<span class="s1">max_flow_for_route </span><span class="s5">= </span><span class="s1">min</span><span class="s4">(</span><span class="s1">max_flow_for_route</span><span class="s4">, </span><span class="s1">flow</span><span class="s4">[</span><span class="s1">father</span><span class="s4">[</span><span class="s1">destAux</span><span class="s4">]][</span><span class="s1">destAux</span><span class="s4">]);</span>
<span class="s1">destAux </span><span class="s5">= </span><span class="s1">father</span><span class="s4">[</span><span class="s1">destAux</span><span class="s4">];</span>
<span class="s4">}</span>
<span class="s1">destAux </span><span class="s5">= </span><span class="s1">dest</span><span class="s4">;</span>
<span class="s1">srcAux </span><span class="s5">= </span><span class="s1">src</span><span class="s4">;</span>
<span class="s7">//acum updatez graful rezidual pe drumul gasit de bfs</span>
<span class="s3">while</span><span class="s4">(</span><span class="s1">destAux</span><span class="s5">!=</span><span class="s1">srcAux</span><span class="s4">)</span>
<span class="s4">{</span>
<span class="s1">fNode </span><span class="s5">= </span><span class="s1">father</span><span class="s4">[</span><span class="s1">destAux</span><span class="s4">];</span>
<span class="s1">flow</span><span class="s4">[</span><span class="s1">fNode</span><span class="s4">][</span><span class="s1">destAux</span><span class="s4">] </span><span class="s5">-= </span><span class="s1">max_flow_for_route</span><span class="s4">; </span><span class="s7">//muchia mea pe directia corecta va avea o capacitate mai mica de flow</span>
<span class="s1">flow</span><span class="s4">[</span><span class="s1">destAux</span><span class="s4">][</span><span class="s1">fNode</span><span class="s4">] </span><span class="s5">+= </span><span class="s1">max_flow_for_route</span><span class="s4">; </span><span class="s7">//muchia pe directia inversa va avea mai mult flow de dat,</span>
<span class="s7">//logic pt ca voi avea mai mult flow de extras</span>
<span class="s1">destAux </span><span class="s5">= </span><span class="s1">fNode</span><span class="s4">;</span>
<span class="s4">}</span>
<span class="s1">finalFlow </span><span class="s5">+= </span><span class="s1">max_flow_for_route</span><span class="s4">; </span><span class="s7">//adun flow-ul drumului la flow-ul final</span>
<span class="s4">}</span>
<span class="s3">return </span><span class="s1">finalFlow</span><span class="s4">;</span>
<span class="s4">}</span>
<span class="s3">int </span><span class="s1">main</span><span class="s4">()</span>
<span class="s4">{</span>
<span class="s3">int </span><span class="s1">n</span><span class="s4">,</span><span class="s1">m</span><span class="s4">,</span><span class="s1">node1</span><span class="s4">,</span><span class="s1">node2</span><span class="s4">,</span><span class="s1">flux</span><span class="s4">;</span>
<span class="s1">f</span><span class="s5">>></span><span class="s1">n</span><span class="s5">>></span><span class="s1">m</span><span class="s4">;</span>
<span class="s1">flow</span><span class="s4">.</span><span class="s1">resize</span><span class="s4">(</span><span class="s6">1001</span><span class="s4">);</span>
<span class="s1">gr</span><span class="s4">.</span><span class="s1">resize</span><span class="s4">(</span><span class="s6">1001</span><span class="s4">);</span>
<span class="s3">for</span><span class="s4">(</span><span class="s3">int </span><span class="s1">i</span><span class="s5">=</span><span class="s6">1</span><span class="s4">;</span><span class="s1">i</span><span class="s5"><=</span><span class="s6">1001</span><span class="s4">;</span><span class="s1">i</span><span class="s5">++</span><span class="s4">)</span>
<span class="s1">flow</span><span class="s4">[</span><span class="s1">i</span><span class="s4">].</span><span class="s1">resize</span><span class="s4">(</span><span class="s6">1001</span><span class="s4">);</span>
<span class="s3">for</span><span class="s4">(</span><span class="s3">int </span><span class="s1">i</span><span class="s5">=</span><span class="s6">1</span><span class="s4">;</span><span class="s1">i</span><span class="s5"><=</span><span class="s1">m</span><span class="s4">;</span><span class="s1">i</span><span class="s5">++</span><span class="s4">)</span>
<span class="s4">{</span>
<span class="s1">f</span><span class="s5">>></span><span class="s1">node1</span><span class="s5">>></span><span class="s1">node2</span><span class="s5">>></span><span class="s1">flux</span><span class="s4">;</span>
<span class="s1">gr</span><span class="s4">[</span><span class="s1">node1</span><span class="s4">].</span><span class="s1">push_back</span><span class="s4">(</span><span class="s1">node2</span><span class="s4">);</span>
<span class="s1">gr</span><span class="s4">[</span><span class="s1">node2</span><span class="s4">].</span><span class="s1">push_back</span><span class="s4">(</span><span class="s1">node1</span><span class="s4">);</span>
<span class="s1">flow</span><span class="s4">[</span><span class="s1">node1</span><span class="s4">][</span><span class="s1">node2</span><span class="s4">] </span><span class="s5">= </span><span class="s1">flux</span><span class="s4">;</span>
<span class="s4">}</span>
<span class="s7">// for(int i =1; i<=n;i++)</span>
<span class="s7">// {for(auto j: gr[i])</span>
<span class="s7">// g<<j<<' ';</span>
<span class="s7">// g<<endl;}</span>
<span class="s7">// g<<endl;</span>
<span class="s7">// for(int i =1; i<=n;i++)</span>
<span class="s7">// {for(auto j: flow[i])</span>
<span class="s7">// g<<j<<' ';</span>
<span class="s7">// g<<endl;}</span>
<span class="s1">g</span><span class="s5"><<</span><span class="s1">fordFulkerson</span><span class="s4">(</span><span class="s1">n</span><span class="s4">,</span><span class="s6">1</span><span class="s4">,</span><span class="s1">n</span><span class="s4">);</span>
<span class="s3">return </span><span class="s6">0</span><span class="s4">;</span>
<span class="s4">}</span>
</pre>
</body>
</html>