POJ 1325 Machine Schedule(最大匹配數=最小點覆蓋)
阿新 • • 發佈:2019-02-11
題意:給你2個機器A(A的模式有n種,標號從0到n-1)和B(B的模式有m種,標號從0到m-1),然後給你k個任務,(i,x,y)表示做完第i個任務可以用A機器的x模式和B機器的y模式
思路:很裸的二分圖最小點覆蓋,這道題需要注意點,A,B機器剛開始的模式都是0,所以在模式0處的不算,這個算是一個坑吧,看了別人的部落格才知道
AC程式碼:
大神地址1:點選開啟連結#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> #include <cctype> using namespace std; int map1[110][110]; int visit[110]; int link[110]; int n,m,k; bool dfs(int l) { int i; for(i=1; i<m; i++) { if(map1[l][i] && !visit[i]) { visit[i] = 1; if(link[i] == -1 || dfs(link[i])) { link[i] = l; return true; } } } return false; } int main() { int i; while(scanf("%d",&n) && n) { scanf("%d%d",&m,&k); memset(map1,0,sizeof(map1)); memset(link,-1,sizeof(link));//不能用0表示link的有無,因為有可能link的值就是0 int a,x,y; for(i=1; i<=k; i++) { scanf("%d%d%d",&a,&x,&y); map1[x][y] = 1; } int sum = 0; for(i=1; i<n; i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) sum++; } printf("%d\n",sum); } return 0; }