Pagini recente » Cod sursa (job #21627) | Cod sursa (job #2699384) | Cod sursa (job #2873087) | Cod sursa (job #2698447) | Cod sursa (job #981978)
Cod sursa(job #981978)
#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,l[maxn],r[maxn];
vector <int> RG[maxn],LG[maxn];
bool ok,viz[maxn],fel1[maxn],fel2[maxn];
bool find_augmenting_path(int node)
{
if (viz[node]) return 0;
viz[node]=1;
for (vector<int>::iterator it=RG[node].begin(); it!=RG[node].end(); ++it)
{
if (!r[*it])
{
r[*it]=node;
l[node]=*it;
return 1;
}
}
for (vector<int>::iterator it=RG[node].begin(); it!=RG[node].end(); ++it)
{
if (find_augmenting_path(r[*it]))
{
r[*it]=node;
l[node]=*it;
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=0;
do
{
ok=0;
memset (viz,0,n+1);
for (int i=1; i<=n; i++)
if (!l[i])
{
if (find_augmenting_path(i))
{
++matching;
ok=1;
}
}
} while (ok);
for (int i=1; i<=n; i++)
{
if (l[i])
{
if (RG[i].size() <= LG[l[i]].size())
fel1[i]=1;
}
else fel1[i]=1;
if (r[i])
{
if (LG[i].size() < RG[r[i]].size())
fel2[i]=1;
}
else fel2[i]=1;
}
fout<<2*n-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;
}