Pagini recente » Clasament fmi | Cod sursa (job #1297563) | Cod sursa (job #756643) | Cod sursa (job #766725) | Cod sursa (job #3191418)
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <utility>
#include <fstream>
int n;
std::vector<std::vector<int>> capacity(202, std::vector<int>(202, 0));
std::vector<std::vector<int>> adj_list(202, std::vector<int>(202, 0));
std::vector<std::pair<int,int>> edge_list;
int bfs(int s, int t, std::vector<int>& parent)
{
for(size_t i=0; i<parent.size();i++)
parent[i] = -1;
parent[s] = -2;
std::queue<std::pair<int, int>> q;
q.push({s, INT_MAX});
while(!q.empty())
{
int node = q.front().first;
int flow = q.front().second;
q.pop();
for(int vec = 0; vec < (int)adj_list[node].size(); ++vec)
{
if(adj_list[node][vec] && parent[vec] == -1 && capacity[node][vec])
{
parent[vec] = node;
int new_flow = std::min(flow, capacity[node][vec]);
if(vec == t)
return new_flow;
q.push({vec, new_flow});
}
}
}
return 0;
}
int maxflow(int s, int t)
{
int flow = 0;
std::vector<int> parent(n);
int new_flow;
while(new_flow = bfs(s, t, parent))
{
flow += new_flow;
int node = t;
while(node != s)
{
int prev = parent[node];
capacity[prev][node] -= new_flow;
capacity[node][prev] += new_flow;
node = prev;
}
}
return flow;
}
int main()
{
std::ifstream f("harta.in");
std::ofstream g("harta.out");
int nr=0, ind=0, outd=0;
f >> nr;
n = 2*nr + 2;
int s = 0;
int t = 2 * nr + 1;
for(int i=1;i<=nr;i++)
adj_list[s][i] = adj_list[i][s] = 1;
for(int i=nr+1; i<=2*nr;i++)
adj_list[i][t] = adj_list[t][i] = 1;
for(int i=1;i<=nr;i++)
for(int j=nr+1;j<=2*nr;j++)
if(i!=j-nr)
{
adj_list[i][j] = adj_list[j][i] = 1;
capacity[i][j] = 1;
}
for(int i=1;i<=nr;i++)
{
f >> outd >> ind;
capacity[s][i] = outd;
capacity[i+nr][t] = ind;
}
g << maxflow(s, t)<<"\n";
for(int i=1;i<=nr;i++)
for(int j=nr+1;j<=2*nr;j++)
if(!capacity[i][j] && i!=j-nr)
g << i << " " << j-nr << "\n";
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
std::cout<<adj_list[i][j]<<" ";
std::cout<<"\n";
}
f.close();
g.close();
return 0;
}