歡迎使用CSDN markdown編輯器

2021-07-06 03:13:58 字數 1616 閱讀 9336

第一次在csdn發文章,算是對演算法很有興趣的業餘超級小白的隨行筆記。

tyvj 1035 棋盤覆蓋

算是最大流問題的初步練習吧,看了好久的最大流最小費問題,道理都略知一二,還是寫不好這**。

這個棋盤覆蓋問題應該是 最大流問題下的 二分圖型別 中最簡單的 最大匹配問題了。

對於這類問題,有一種不錯的演算法,叫做匈牙利演算法。匈牙利演算法點這裡

以下是我在c語言上的實現。

看到各種答題的**都蠻短,感覺自己**特別囉嗦,不知道有沒有什麼原因,願有心人能夠給點指點。

各種術語都是憑印象用,如果有什麼錯誤,希望能夠指出!

#include 

#define p(x,y) (((x)-1)*n + (y))

//go from two dimension to one

int n,m;

int partner[10001];//記錄在當前匹配數最大的情況下,每個位置匹配到的位置

intqueue[10001];//bfs的搜尋順序列

int tporigin[10001];//記錄(temporaryorigin)本次bfs該節點的父節點

//(即如果本次bfs成功的話,該點要匹配的新partner)

int count;//記錄bfs序列的長度

int lookto(int x0, int y0, int x, int y)

else

if (partner[p(x, y)] > 0 && tporigin[p(x, y)] == 0)

return0;}

int hasfreevoisinage(int x, int y)

if (y > 1)

if (x > 1)

if (x < n)

return0;}

void rollback(int p0, int i)

partner[i] = p0;

partner[p0] = i;

return;

}void search(int x, int y)

}//把(x,y)放入bfs序列當中

count = 1;

queue[1] = p(x,y);

//遍歷bfs序列

int temp;

for (int i = 1; i <= count; i++)

}}int main(int argc, const

char * argv)

}int x,y;

//記錄棋盤缺失的位置

for (int i = 1; i <= m; i++)

for (int i = 1; i <= n; i++)

// printf("\n");

// }

// printf("\n");

//這段**用於展示尋找增廣路的過程,for debugging}}

//計數

int num = 0;

for (int i = 1; i <= n; i++)

}printf("%d", num/2);

}

歡迎使用CSDN markdow

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

歡迎毛毛與妞妞使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

歡迎使用CSDN markdow1n編輯器

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...