Pagini recente » Cod sursa (job #914827) | Cod sursa (job #1517311) | Cod sursa (job #782610) | Cod sursa (job #120296) | Cod sursa (job #2976694)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("drumuri2.in");
ofstream fout("drumuri2.out");
int const N = 401, inf = (1 << 30);
int n , m;
int st[N] , dr[N] , lv[N] , viz[N];
vector<int> v[N] , g[N];
void dfs1(int x , int t = -1){
viz[x] = 1;
for(int y : g[x]){
if(t != y && !viz[y])
dfs1(y , x);
}
}
bool bfs(){
queue<int> q;
for(int i = 1 ; i <= n ; ++ i)
if(!dr[i])
q.push(i) , lv[i] = 0;
else
lv[i] = inf;
lv[0] = inf;
while(!q.empty()){
int x = q.front();
q.pop();
if(lv[x] >= lv[0])
continue;
for(int y : v[x]){
if(lv[st[y]] == inf){
lv[st[y]] = 1 + lv[x];
q.push(st[y]);
}
}
}
return lv[0] != inf;
}
bool dfs(int x){
if(x == 0)
return true;
for(int y : v[x]){
if(lv[st[y]] == 1 + lv[x] && dfs(st[y])){
dr[x] = y;
st[y] = x;
return true;
}
}
lv[x] = inf;
return false;
}
int maxmatch(){
int r = 0;
while(bfs()){
for(int i = 1 ; i <= n ; ++ i)
if(!dr[i] && dfs(i))
++ r;
}
return r;
}
int main()
{
fin >> n >> m;
for(int i = 1 ; i <= m ; ++ i){
int x , y;
fin >> x >> y;
g[x].push_back(y);
}
for(int i = 1 ; i <= n ; ++ i){
for(int j = 1 ; j <= n ; ++ j)
viz[j] = 0;
dfs1(i);
for(int j = 1 ; j <= n ; ++ j)
if(viz[j] && j != i)
v[i].push_back(j + n);
}
fout << n - maxmatch() << '\n';
return 0;
}