poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)

时间:2023-03-09 03:09:27
poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)
 poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)
1 #include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define N 505
using namespace std; int g[N][N];
int n, m;
int vis[N], linker[N];
bool dfs(int u){
for(int i=; i<=n; ++i)
if(g[u][i] && !vis[i]){
vis[i]=;
if(!linker[i] || dfs(linker[i])){
linker[i]=u;
return true;
}
}
return false;
} int main(){
while(scanf("%d%d", &n, &m) && (n||m)){
memset(g, , sizeof(g));
while(m--){
int u, v;
scanf("%d%d", &u, &v);
g[u][v]=;
}
for(int k=; k<=n; ++k)
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
if(!g[i][j])
g[i][j]=g[i][k]&&g[k][j];
memset(linker, , sizeof(linker));
int ans=;
for(int i=; i<=n; ++i){
memset(vis, , sizeof(vis));
if(dfs(i)) ++ans;
}
printf("%d\n", n-ans);
}
return ;
}