HDU 1150 Machine Schedule(匈牙利算法 二分圖的最小頂點覆蓋 二分圖最大匹配)

題意:

有兩臺機器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>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章