Pagini recente » Cod sursa (job #2637549) | Cod sursa (job #953458) | Istoria paginii runda/cv1011/clasament | Istoria paginii utilizator/ana_ilie | Cod sursa (job #1294314)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
vector <int> G[10005];
int ind,ind2;
bool Use[10005],UseL[10005],UseR[10005];
int L[10005],R[10005];
int N,M,E;
void Read()
{
int i,j,value;
f>>N>>M;
for(i=1;i<=M;i++)
{
int x,y;
f>>x>>y;
G[x].push_back(y);
}
}
bool pairup(int n)
{
unsigned int i=0;
if(Use[n]==1)
return 0;
Use[n]=1;
for(i=0;i<G[n].size();i++)
{
int vecin=G[n][i];
if(R[vecin]==0)
{
R[vecin]=n;
L[n]=vecin;
UseL[n]=1;
return 1;
}
}
for(i=0;i<G[n].size();i++)
{
int vecin=G[n][i];
if(pairup(R[vecin])==1)
{
R[vecin]=n;
L[n]=vecin;
UseL[n]=1;
return 1;
}
}
return 0;
}
void Cuplaj()
{
int i,cuplaj=0;
bool change=1;
while(change==1)
{
change=0;
memset(Use,0,sizeof(Use));
for(i=1;i<=N;i++)
if(L[i]==0)
change |=pairup(i);
}
for(i=1;i<=N;i++)
if(L[i]>0)
cuplaj++;
g<<2*N-cuplaj<<"\n";
}
void PairUp(int node)
{
for(int i=0;i<G[node].size();i++)
{
int neighb=G[node][i];
if(UseR[neighb]==0)
{
UseR[neighb]=1;
UseL[L[neighb]]=0;
PairUp(L[neighb]);
}
}
}
void Support()
{
int i;
for(int i=1;i<=N;i++)
if(UseL[i]==0)
{
PairUp(i);
}
for(int i=1;i<=N;i++)
{
if(UseL[i]==0 && UseR[i]==0)
{
g<<3<<"\n";
continue;
}
if(UseL[i]==1 && UseR[i]==0)
{
g<<2<<"\n";
continue;
}
if(UseL[i]==0 && UseR[i]==1)
{
g<<1<<"\n";
continue;
}
g<<0<<'\n';
}
}
int main()
{
Read();
Cuplaj();
Support();
return 0;
}