这个题的巧妙之处在于构图,将问题转换为二分图的最小顶点覆盖(最大匹配)!
然后还有个tricker:At the beginning they are both work at mode_0.
没过的朋友们仔细揣摩一下吧!
#include <iostream> #include<cstdio> #include<string.h> using namespace std; int n,m,k; bool mat[110][110]; int match[110]; bool visited[110]; bool find(int x) { for(int i=1; i<m; i++) { if( mat[x][i] && !visited[i] ) { visited[i]=true; if( match[i]==-1||find(match[i]) ) { match[i]=x; return true; } } } return false; } int main() { while(cin>>n&&n) { memset(mat,0,sizeof(mat)); memset(match,-1,sizeof(match)); cin>>m>>k; for(int i=0; i<k; i++) { int job,x,y; scanf("%d%d%d",&job,&x,&y); mat[x][y]=1; } int maxi=0; for(int i=1; i<n; i++) { memset(visited,0,sizeof(visited)); if(find(i))maxi++; } cout<<maxi<<endl; } return 0; }