第一次在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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...