Mai intai trebuie sa te autentifici.
Cod sursa(job #1625296)
Utilizator | Data | 2 martie 2016 18:02:21 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.72 kb |
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
long n,i,sav,m,e,ok,viz[20005],u,v,C[20005];
vector<int> G[20005];
void cup(long nod)
{
for (int i=0;i<G[nod].size();i++)
if (C[G[nod][i]]==0)
{
C[nod]=G[nod][i];
C[G[nod][i]]=nod;
return ;
}
}
void greedy()
{
for (int i=1;i<=n+m;i++)
{
if (C[i]==0)
cup(i);
}
}
void cupleaza(long a,long b)
{
C[a]=b;
C[b]=a;
}
void decupleaza(long a)
{
C[a]=0;
}
bool dfs(long nod)
{
viz[nod]=sav;
for (int i=0;i<G[nod].size();i++)
{
if (viz[G[nod][i]]!=sav)
{
if (C[G[nod][i]]!=0)
{
viz[G[nod][i]]=sav;
if (dfs(C[G[nod][i]]))
{
decupleaza(C[nod]);
cupleaza(nod,G[nod][i]);
return 1;
}
}
else
{
decupleaza(C[nod]);
cupleaza(nod,G[nod][i]);
return 1;
}
}
}
return 0;
}
int main()
{
f>>n>>m>>e;
for (i=1;i<=e;i++)
{
f>>u>>v;
v+=n;
G[u].push_back(v);
G[v].push_back(u);
}
greedy();
for (i=1;i<=n;i++)
{
if (C[i]==0)
{
sav=i;
dfs(i);
}
}
long nr=0;
for (i=1;i<=n;i++)
if(C[i]!=0)
nr++;
g<<nr<<'\n';
for (i=1;i<=n;i++)
if (C[i]!=0)
g<<i<<' '<<C[i]-n<<'\n';
return 0;
}