有兩臺機器A和B以及N個需要運行的任務。每臺機器有M種不同的模式,而每個任務都恰好在一臺機器上運行。如果它在機器A上運行,則機器A需要設置爲模式ai,如果它在機器B上運行,則機器A需要設置爲模式bi。每臺機器上的任務可以按照任意順序執行,但是每臺機器每轉換一次模式需要重啓一次。請合理爲每個任務安排一臺機器併合理安排順序,使得機器重啓次數儘量少。
要找的就是最多能連幾根線,當然每個點只能用一次
此題所求直接就是最大匹配數
一般二分圖匹配有三個問題
(1):求最小頂點覆蓋=最大匹配數
(2):求最小路徑覆蓋=節點數-最大匹配數
(3):求最大獨立集數,分兩種,一種兩邊點重複的,節點數-最大匹配數/2
一種一邊n個點,一邊m個點,n+m-最大匹配數
這三類題在我博客中都有
題目鏈接:點擊打開鏈接
代碼註釋:
<span style="font-size:18px;color:#ff6600;"><strong>#include<iostream>
#include<cstring>
using namespace std;
#define N 105
int n,m,k;
int a[N][N],visit[N],link[N];//a[][]存地圖 visit[]是否被訪問 link[]存與之關聯的點
bool dfs(int u)
{
int v;
for(v=1; v<m; v++)
if(a[u][v]&&!visit[v]) //兩點有關聯切該點未被訪問
{
visit[v]=1;
if(link[v]==-1||dfs(link[v])) //如果該點沒有與其他點關聯或者 與之關聯的點 由遞歸可以找到其他點與之相連
{
link[v]=u;
return true;
}
}
return false;
}
int hungary()
{
int u,s=0;
memset(link,-1,sizeof(link));
for(u=1; u<n; u++)
{
memset(visit,0,sizeof(visit));
if(dfs(u))
s++;
}
return s;
}
int main()
{
while(cin>>n,n)
{
cin>>m>>k;
int id,x,y;
memset(a,0,sizeof(a));
while(k--)
{
cin>>id>>x>>y;
if(x&&y)
a[x][y]=1; //有關聯置爲1
}
cout<<hungary()<<endl;
}
}</strong></span>