Pagini recente » Cod sursa (job #395810) | Cod sursa (job #2101126) | Cod sursa (job #2386465) | Cod sursa (job #612229) | Cod sursa (job #2678933)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n,m,cap[1005][1005],flux[1005][1005],coada[1000005],q,tata[1005];
bool fost[1005];
vector<int>vecini[1005];
bool solve()
{
for(int i=0; i<=n+m+1; i++) fost[i]=0;
fost[0]=1;
int nr=1;
coada[1]=0;
for(int i=1; i<=nr; i++)
{
int nod=coada[i];
if( nod==n+m+1 ) continue;
for(int j=0; j<vecini[nod].size(); j++)
{
int x=vecini[nod][j];
if( fost[x]||cap[nod][x]==flux[nod][x] ) continue;
fost[x]=1;
coada[++nr]=x;
tata[x]=nod;
}
}
return fost[n+m+1];
}
int main()
{
f>>n>>m>>q;
for(int i=1; i<=q; i++)
{
int x,y;
f>>x>>y;
vecini[x].push_back(y+n);
vecini[y+n].push_back(x);
cap[x][y+n]=1;
}
for(int i=1; i<=n; i++) cap[0][i]=1,vecini[0].push_back(i);
for(int i=n+1; i<=n+m; i++) cap[i][n+m+1]=1,vecini[i].push_back(n+m+1),vecini[n+m+1].push_back(i);
int cuplaj=0;
while( solve() )
{
for(int i=0; i<vecini[n+m+1].size(); i++)
{
int nod=vecini[n+m+1][i];
if( !fost[nod]||flux[nod][n+m+1]==cap[nod][n+m+1] ) continue;
tata[n+m+1]=nod;
int fff=10000000;
for(int j=n+m+1; j!=0; j=tata[j])
fff=min( fff,cap[tata[j]][j]-flux[tata[j]][j] );
if( fff==0 ) continue;
for(int j=n+m+1; j!=0; j=tata[j])
flux[tata[j]][j]+=fff,flux[j][tata[j]]-=fff;
cuplaj+=fff;
}
}
g<<cuplaj<<'\n';
for(int i=1; i<=n; i++)
{
for(int j=0; j<vecini[i].size(); j++)
{
int nod=vecini[i][j];
if( flux[i][nod]==1 ) g<<i<<' '<<nod-n<<'\n';
}
}
}