二分圖

說說二分圖,其實(shí)圖論的題難點(diǎn)不在用算法,難在如何建圖,只有圖建好了,剩下的就簡單了,在這說說求二分圖的算法,即匈牙利算法,其實(shí)一點(diǎn)都不難,也很好理解拿筆寫寫就行了.

二分圖最大匹配----匈牙利算法

重要的一點(diǎn)就是看出來了用二分圖做,然后就是建圖了,再然后適當(dāng)修改Find函數(shù)就行了.

int n,m;
int link[1001];
bool vis[1001];
vector<int>data[1001];
bool Find(int x)
{
    for(int i=0;i<data[x].size();i++){
        int m=data[x][i];
        if(!vis[m]){
            vis[m] = true;
            if(!link[m] || Find(link[m])){
                link[m] = x;
                link[x] = m;
                return true;
            }
        }
    }
    return false;
}

模板題
AC代碼:

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define CLR(x) memset(x,0,sizeof(x))
int n,m;
int link[1001];
bool vis[1001];
vector<int>data[1001];
bool Find(int x)
{
    for(int i=0;i<data[x].size();i++){
        int m=data[x][i];
        if(!vis[m]){
            vis[m] = true;
            if(!link[m] || Find(link[m])){
                link[m] = x;
                link[x] = m;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    scanf("%d%d",&n,&m);
    CLR(link);
    int ans=0;
    for(int i=0;i<m;i++){
        int u,v;
        scanf("%d%d",&u,&v);
        data[u].push_back(v);
        data[v].push_back(u);
    }
    for(int i=1;i<=n;i++)
    {
        CLR(vis);
        if(!link[i] && Find(i))   //記住判斷的先后邏輯順序!!!
            ans++;
    }
    printf("%d\n", ans);
}

這里有些重要的定理,有許多題經(jīng)過建圖后發(fā)現(xiàn)就是求這些,故常常配合著這個二分圖來運(yùn)算需要記住!!!
(通過一些小的改變即可達(dá)到要求)
定理:
定理1:最大匹配數(shù)M = 最小點(diǎn)覆蓋數(shù)
定理2:最大獨(dú)立集 = 頂點(diǎn)數(shù) - 最大匹配數(shù)
定理3:有向圖最小路徑覆蓋數(shù) = 頂點(diǎn)數(shù) - 最大匹配數(shù)
定理4:無向圖最小路徑覆蓋數(shù) = 頂點(diǎn)數(shù) - 最大匹配數(shù)/2
(因?yàn)樘幚磉^兩次)
對以上名詞的一些解釋:
最大匹配數(shù):最大匹配的匹配邊的數(shù)目
最小點(diǎn)覆蓋數(shù):選取最少的點(diǎn)饮怯,使任意一條邊至少有一個端點(diǎn)被選擇
最大獨(dú)立集:選取最多的點(diǎn)丸冕,使任意所選兩點(diǎn)均不相連
最小路徑覆蓋數(shù):對于一個 DAG (有向無環(huán)圖),選取最少條路徑,使得每個頂點(diǎn)屬于且僅屬于一條路徑。路徑長可以為 0 (即單個點(diǎn)).
證明略.

二分圖判定----染色法
模板題在此

染色法判斷是否是二分圖.

AC代碼:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define CLR(x) memset(x,0,sizeof(x))
const int maxn=1e4+5;
int cas=1;
bool flag;
int n,m;
bool vis[maxn][maxn];   //vis[i][j] 表示 i 到 j 是否相連過.是的話數(shù)組值為1,否則為 0 .
vector<int>ve[maxn];
int color[maxn];
void dfs(int x,int col)
{
    if(!flag) return ;   //flag=false, 后面就都沒有必要再搜下去了.
    if(!color[x]) color[x]=col;  //如果該點(diǎn)沒有被染色,就染上.
    else if(color[x]!=col){   //如果遇到將要染色的點(diǎn)不等于將要被染的色,則結(jié)束dfs,不是二分圖.
        flag=false;
        return ;
    }
    for(int i=0;i<ve[x].size();i++)
    {
        int next=ve[x][i];
        if(!vis[x][next] && !vis[next][x]){
            vis[x][next]=1;
            dfs(next,3-col);
        }
    }
}
int main()
{
    int t;
    cin >> t;
    while(t--){
       flag=true;
       scanf("%d %d",&n,&m);
       CLR(color);
       CLR(vis);
       for(int i=1;i<=n;i++)
           ve[i].clear();
       for(int i=0;i<m;i++){
            int u,v;
            scanf("%d %d",&u,&v);
            ve[u].push_back(v);
            ve[v].push_back(u);
        }
        for(int i=1;i<=n;i++)
        {
            if(!color[i]) dfs(i,1);    //循環(huán)染色.  分別左邊染1,右邊染2 .
        }
        if(flag) printf("Correct\n");
        else
            printf("Wrong\n");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挨约,一起剝皮案震驚了整個濱河市味混,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诫惭,老刑警劉巖翁锡,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夕土,居然都是意外死亡馆衔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門怨绣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來角溃,“玉大人,你說我怎么就攤上這事篮撑〖跸福” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵咽扇,是天一觀的道長邪财。 經(jīng)常有香客問我,道長质欲,這世上最難降的妖魔是什么树埠? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮嘶伟,結(jié)果婚禮上怎憋,老公的妹妹穿的比我還像新娘。我一直安慰自己九昧,他們只是感情好绊袋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铸鹰,像睡著了一般癌别。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹋笼,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天展姐,我揣著相機(jī)與錄音,去河邊找鬼剖毯。 笑死圾笨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逊谋。 我是一名探鬼主播擂达,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胶滋!你這毒婦竟也來了板鬓?” 一聲冷哼從身側(cè)響起悲敷,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎穗熬,沒想到半個月后镀迂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唤蔗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年探遵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妓柜。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡箱季,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棍掐,到底是詐尸還是另有隱情藏雏,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布作煌,位于F島的核電站掘殴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粟誓。R本人自食惡果不足惜奏寨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹰服。 院中可真熱鬧病瞳,春花似錦、人聲如沸悲酷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽设易。三九已至逗柴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顿肺,已是汗流浹背戏溺。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挟冠,地道東北人于购。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓袍睡,卻偏偏與公主長得像知染,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子斑胜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 定義## 記圖 G = (V, E) 最大流問題##### 記每條邊所能傳輸?shù)淖畲罅髁繛?c(e) 記每條邊所能傳...
    MrGopher閱讀 973評論 0 1
  • 二分圖又稱作二部圖控淡,是圖論中的一種特殊模型嫌吠。 設(shè)G=(V,E)是一個無向圖,如果頂點(diǎn)V可分割為兩個互不相交的子集(...
    Myth52125閱讀 10,252評論 0 4
  • 二分圖判定: 題目鏈接:二分圖判定 dfs: 最大匹配: 題目鏈接:最大匹配-匈牙利算法 dfs: 二維最大匹配:...
    fo0Old閱讀 552評論 0 1
  • 題目描述 給定一個二分圖掺炭,結(jié)點(diǎn)個數(shù)分別為n,m辫诅,邊數(shù)為e,求二分圖最大匹配數(shù) 輸入輸出格式 輸入格式第一行涧狮,n,m...
    Ricardo_Y_Li閱讀 325評論 0 1
  • 分別總是會有一些猝不及防。 與媽媽告別的時候涉枫,和她笑著揮揮手邢滑。 “路上注意安全≡柑” “嗯知道啦困后。” “包里裝的堅果...
    車小花閱讀 602評論 0 2