hdu 1150 Machine Schedule 最小覆蓋點 匈牙利演算法
阿新 • • 發佈:2019-01-22
A B兩個機器,存在多種模式,有n個任務可以用A機器的i模式 或者B機器的j模式,任何一個機器轉換模式都需要重啟一次,求最少重啟次數,最少點覆蓋
最小點覆蓋=最大匹配數匈牙利演算法,
code:
#include<iostream> #include<algorithm> #include<stdio.h> #include<math.h> #include<string.h> using namespace std; int map[110][110],n,m,k,vis[110],link[110]; bool dfs(int s) { for(int i=0;i<m;i++) { if(map[s][i] && !vis[i]) { vis[i]=1; if(link[i]==-1 || dfs(link[i])) { link[i]=s; return true; } } } return false; } int hungary() { memset(link,-1,sizeof(link)); int ans=0; for(int i=0;i<n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } return ans; } int main() { //freopen("i.txt","r",stdin); int i,j,x,y,t,ans; while(scanf("%d",&n)!=EOF && n) { scanf("%d%d",&m,&k); memset(map,0,sizeof(map)); while(k--) { scanf("%d%d%d",&t,&x,&y); if(x>0 && y>0) map[x][y]=1; } ans=hungary(); printf("%d\n",ans); } return 0; }