HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:現在有一個機器A和一個機器B,A機器有n種模式,B機器有m種模式,現在有k次工作需要完成,每次工作的信息為:
id x y:編號為id,在A機器要用x模式完成,在B機器要用y模式完成,每次切換模式需要記錄操作次數,問怎樣調換工作順序,可以讓操作次數最少
題目分析:很明顯的二分圖匹配問題了,不過需要分析一下,挺好的一道題目,首先機器A和機器B可以分為兩個互相獨立的子集,而每一項工作就可以將機器A中的一種模式和機器B中的一種模式建邊,最后一共建了k條邊,因為每個工作都需要完成,也就是到最后每一條邊都需要覆蓋,而二分圖的最小點覆蓋問題的定義是:假如選了一個點就相當于覆蓋了以它為端點的所有邊。最小頂點覆蓋就是選擇最少的點來覆蓋所有的邊。
這樣一來問題就轉換為最小點覆蓋的問題了,根據公式可知:最小點覆蓋=二分圖最大匹配,這樣跑一遍匈牙利的板子就過了
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=110;int n,m,k;bool maze[N][N],vis[N];int match[N];bool dfs(int x) {for(int i=1;i<=m;i++){if(maze[x][i]&&!vis[i]){vis[i]=true;if(!match[i]||dfs(match[i])){match[i]=x;return true;}}}return false; }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);while(scanf("%d",&n)!=EOF&&n){scanf("%d%d",&m,&k);memset(match,0,sizeof(match));memset(maze,false,sizeof(maze));while(k--){int id,x,y;scanf("%d%d%d",&id,&x,&y);maze[x][y]=true;}int ans=0;for(int i=1;i<=n;i++){memset(vis,false,sizeof(vis));if(dfs(i))ans++;}printf("%d\n",ans);}return 0; }?
總結
以上是生活随笔為你收集整理的HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SPOJ - QTREE Query o
- 下一篇: CodeForces - 343D Wa