Pagini recente » Cod sursa (job #397326) | Cod sursa (job #2503744) | Cod sursa (job #2674590) | Cod sursa (job #2035087) | Cod sursa (job #981931)
Cod sursa(job #981931)
#include <fstream>
#include <vector>
#include <cstring>
#define maxn 8192
using namespace std;
ifstream fin("felinare.in");
ofstream fout("felinare.out");
int n,m,a,b,sw,targeted[maxn],coupled[maxn];
vector <int> RG[maxn],LG[maxn];
bool ok,viz[maxn],viz2[maxn],fel1[maxn],fel2[maxn];
bool find_augmenting_path_right (int node);
bool find_augmenting_path_left (int node)
{
if (viz2[node]) return 1;
viz2[node]=1;
bool ok=0;
for (vector<int>::iterator it=LG[node].begin(); it!=LG[node].end(); ++it)
{
if (!fel1[*it])
ok |= find_augmenting_path_right (*it);
if (ok) break;
}
if (ok) {fel2[node]=0; return 1;}
return 0;
}
bool find_augmenting_path_right (int node)
{
if (viz[node]) return 0;
viz[node]=1;
bool ok=1;
for (vector<int>::iterator it=RG[node].begin(); it!=RG[node].end(); ++it)
{
if (fel2[*it])
ok &= find_augmenting_path_left (*it);
if (!ok) break;
}
if (ok)
{
fel1[node]=1;
return 1;
}
return 0;
}
int main()
{
fin>>n>>m;
for (int i=1; i<=m; i++)
{
fin>>a>>b;
RG[a].push_back(b);
LG[b].push_back(a);
}
int matching=n;
memset (fel1,0,n+1);
memset (fel2,1,n+1);
do
{
ok=0;
memset (viz,0,n+1);
memset (viz2,0,n+1);
for (int i=1; i<=n; i++)
if (!fel1[i])
{
memset (viz,0,n+1);
memset (viz2,0,n+1);
if (find_augmenting_path_right(i))
{
++matching;
ok=1;
}
}
} while (ok);
fout<<matching<<"\n";
for (int i=1; i<=n; i++)
{
if (fel1[i]==0 && fel2[i]==0) fout<<0;
else if (fel1[i]>0 && fel2[i]==0) fout<<1;
else if (fel1[i]==0 && fel2[i]>0) fout<<2;
else fout<<3;
fout<<"\n";
}
return 0;
}