莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
1. 最小路径点覆盖 = 总点数 - 最大匹配数
#include<bits/stdc++.h>
using namespace std;
const int N = 210;
int n,m;
bool d[N][N],st[N];
int match[N];
bool find(int x)
{
for(int i=1;i<=n;i++)
if(d[x][i]&&!st[i])
{
st[i]=true;
int t=match[i];
if(t==0||find(t))
{
match[i]=x;
return true;
}
}
return false;
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
d[a][b]=true;
}
//传递闭包
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]|=d[i][k]&d[k][j];
int res=0;
for(int i=1;i<=n;i++)
{
memset(st,0,sizeof st);
if(find(i)) res++;
}
cout<<n-res<<endl;
return 0;
}