Pagini recente » Cod sursa (job #1395490) | Cod sursa (job #780974) | Cod sursa (job #2743829) | Cod sursa (job #738132) | Cod sursa (job #972774)
Cod sursa(job #972774)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define newn a[x][i]
using namespace std;
ifstream fin("harta.in");
ofstream fout("harta.out");
const int N = 105*2;
int n, s, m, d, t[N], c[N][N], f[N][N];
vector <int> a[N];
vector <bool> viz(N);
queue <int> q;
bool bfs()
{
for(int i=1; i<=d; i++) viz[i] = 0;
q.push(0); viz[0] = 1;
while(!q.empty())
{
int x = q.front(); q.pop();
for(unsigned i=0; i<a[x].size(); i++)
if(!viz[newn] && f[x][newn] < c[x][newn])
{
t[newn] = x;
viz[newn] = 1;
q.push(newn);
}
}
return viz[d];
}
int main()
{
fin>>n; d = 2*n+1;
for(int i=1; i<=n; i++)
{
int x, y;
fin>>x>>y;
m += x;
a[s].push_back(i);
a[i].push_back(s);
a[i+n].push_back(d);
a[d].push_back(i+n);
c[s][i] = x;
c[i+n][d] = y;
}
for(int i=1; i<=n; i++)
for(int j=n+1; j<d; j++)
if(i != j-n)
{
a[i].push_back(j);
a[j].push_back(i);
c[i][j] = 1;
}
while(bfs())
{
for(int i=1; i<d; i++)
if(f[i][d] < c[i][d])
{
int fmin = c[i][d] - f[i][d];
for(int j=i; j!=s; j=t[j])
fmin = min(fmin, c[t[j]][j] - f[t[j]][j]);
for(int j=i; j!=s; j=t[j])
{
f[t[j]][j] += fmin;
f[j][t[j]] -= fmin;
}
f[i][d] += fmin;
f[d][i] -= fmin;
}
}
fout<<m<<' '<<'\n';
for(int i=1; i<=n; i++)
for(int j=n+1; j<d; j++)
if(f[i][j])
fout<<i<<' '<<j-n<<'\n';
return 0;
}