Machine Schedule
二分图匹配求最小点覆盖,注意只要与0连接的都不算(初始状态,不须重启)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int maxn=1007; 8 int n,m,k,ans; 9 int usd[maxn],ret[maxn]; 10 bool map[maxn][maxn]; 11 void pre(){ 12 memset(usd,false,sizeof(usd)); 13 memset(map,false,sizeof(map)); 14 memset(ret,-1,sizeof(ret)); 15 ans=0; 16 } 17 bool dfs(int x){ 18 for(int i=0;i<m;i++){ 19 if(!usd[i]&&map[x][i]){ 20 usd[i]=true; 21 if(ret[i]==-1||dfs(ret[i])){ 22 ret[i]=x; 23 return true; 24 } 25 } 26 } 27 return false; 28 } 29 int main(){ 30 while(cin>>n&&n!=0){ 31 pre(); 32 cin>>m>>k; 33 for(int i=0;i<k;i++){ 34 int a,b,c;cin>>c>>a>>b; 35 if(a==0&&b==0) continue; 36 map[a][b]=true; 37 } 38 for(int i=0;i<n;i++){ 39 memset(usd,false,sizeof(usd)); 40 if(dfs(i)) ans++; 41 } 42 cout<<ans<<endl; 43 } 44 return 0; 45 }