Pagini recente » Statistici Statie George (StatieGeorge) | Monitorul de evaluare | Cod sursa (job #1266843) | Cod sursa (job #1612944) | Cod sursa (job #2017625)
#include <fstream>
#include <vector>
#include <queue>
#define DIM 10001
#define INF 1000000000
using namespace std;
ifstream fi("cuplaj.in");
ofstream fo("cuplaj.out");
int n,m,e;
vector<int> V[DIM];
int S[DIM],D[DIM];
int rez;
int VIZ[DIM];
queue<int> Q;
bool dfs(int v)
{
if(v!=0)
{
for(int i=0;i<V[v].size();i++)
{
int to=V[v][i];
if(VIZ[D[to]]==VIZ[v]+1)
if(dfs[D[to]])
{
S[v]=to;
D[to]=v;
return true;
}
}
VIZ[v]=INF;
return false;
}
return true;
}
bool bfs()
{
for(int i=1;i<=n;i++)
if(S[i]==0)
{
VIZ[i]=0;
Q.push(i);
}
else
VIZ[i]=INF;
VIZ[0]=INF;
while(!Q.empty())
{
int v=Q.front();
Q.pop();
if(VIZ[v]<VIZ[0])
for(int i=0;i<V[v].size();i++)
{
int to=V[v][i];
if(VIZ[D[to]]==INF)
{
Q.push(D[to]);
VIZ[D[to]]=VIZ[v]+1;
}
}
}
return VIZ[0]!=INF;
}
int main()
{
fi>>n>>m>>e;
for(int i=1;i<=e;i++)
{
int a,b;
fi>>a>>b;
V[a].push_back(b);
}
while(bfs())
{
for(int i=1;i<=n;i++)
if(S[i]==0&&dfs(i))
rez++;
}
fo<<rez<<"\n";
for(int i=1;i<=n;i++)
if(S[i])
fo<<i<<" "<<S[i]<<"\n";
fi.close();
fo.close();
return 0;
}