一开始预习是百度的算法 然后学习了一下
然后找到了学长的ppt 又学习了一下..
发现..居然不一样...
找了模板题试了试..百度的不好用 反正就是wa了..果然还是应当跟着学长混..
图两边的点分别是行数和列数
每有一个点 就让所处行列连一条边
求最小点覆盖
然后卡住...后来看了增林的博客...
最小点覆盖=最大匹配数 果然是模板题..
然后wa..
后来发现是当进行对左边点的遍历的时候 每次都要mem一次vis数组
应该是每次找之前都重新清空啊。。不然下次怎么找啊。。。增光路对点的是否被访问过不是有要求吗 —— 学长原话...
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> using namespace std; int s[505][505]; int vis[505]; int n,m; int link[505]; bool find(int i) { for(int k=1;k<=n;k++) { if(s[i][k]==1&&vis[k]==0) { vis[k]=-1; if(link[k]==-1||find(link[k])) { link[k]=i; return true; } } } return false; } int main(){ while(~scanf("%d%d",&n,&m)) { memset(s,0,sizeof(s)); memset(link,-1,sizeof(link)); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); s[a][b]=1; } int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(find(i)) { ans++; } } printf("%d\n",ans); } }
时间: 2024-12-25 01:12:05