POJ 1149 PIGS 用了三種求最大流的方法

2021-06-05 08:28:24 字數 4813 閱讀 8745

/*

* 第一道最大流, 寫的有點挫, 按照ford演算法來做;

* 也沒用什麼改進的最短增廣演算法;

* 轉化為網路流的模型時稍微有點麻煩;

*/#include #include #include #include using namespace std;

#define maxn 1005

#define inf 9999999

#define inf2 999999

#define min( a, b ) ( (a) <= (b)? (a):(b) )

#define abs( a ) ( (a) >= 0? (a) : -(a) )

// 邊的屬性結構;

struct edgetype

;edgetype edges[maxn][maxn]; // 鄰接矩陣, 當兩點之間不存在邊時,c和f都賦值為inf;

int flag[maxn]; // 標記, -1:未標記,0:已標記未檢查,1:標記並檢查;

int prar[maxn]; // 標號的第乙個分量,用於存放父節點;

int alpha[maxn]; // 標號的第二個分量,存放可改進a;

// 第乙個引數為源點,第二個為匯點;

int ford( int s, int t, int ipointnum )

// 反向且有流量;

if ( edges[i][u].c < inf && edges[i][u].f > 0 )}}

flag[u] = 1; // 標號為檢查完畢;

} // 當匯點沒有進行標號,或調整量為0, 退出迴圈;

if ( flag[t] == -1 || alpha[t] == 0 )

break;

// 進行調整;

int k1 = t, k2 = abs(prar[t]);

while ( true )

}// 存放最大流;

int imaxflow = 0;

for ( int i = 0; i < ipointnum; ++i )

return imaxflow;

}int main()

; int pigs[maxn] = ;

int m;

int n;

scanf( "%d%d", &m, &n );

for ( int i = 0; i < n+2; ++i )

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

scanf( "%d", &pigs[i] );

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

else

}} scanf( "%d", &edges[i][n+1].c );

edges[i][n+1].f = 0;

} cout << ford( 0, n+1, n+2 ) << endl;

return 0;

}

/*

* 改寫用最短路增廣演算法;

* 效率有點提高, 上面的為63ms, 這個為47ms;

* 接下去再寫個連續最短增廣路試試;

*/#include #include #include #include using namespace std;

#define maxn 1005

#define inf 9999999

#define inf2 999999

#define min( a, b ) ( (a) <= (b)? (a):(b) )

#define abs( a ) ( (a) >= 0? (a) : -(a) )

// 邊的屬性結構;

struct edgetype

;edgetype edges[maxn][maxn]; // 鄰接矩陣, 當兩點之間不存在邊時,c和f都賦值為inf;

int flag[maxn]; // 標記, -1:未標記,0:已標記未檢查,1:標記並檢查;

int prar[maxn]; // 標號的第乙個分量,用於存放父節點;

int alpha[maxn]; // 標號的第二個分量,存放可改進a;

int level[maxn]; // 各個頂點的等級;

void bfs( int s, int n )

if ( !level[i] && edges[i][u].c < inf && edges[i][u].f > 0 )

} }}

// 第乙個引數為源點,第二個為匯點, 第三個為頂點個數;

int ford( int s, int t, int n )

// 反向且有流量;

if ( edges[i][u].c < inf && edges[i][u].f > 0 )}}

flag[u] = 1; // 標號為檢查完畢;

}// 當匯點沒有進行標號,或調整量為0, 退出迴圈;

if ( flag[t] == -1 || alpha[t] == 0 )

break;

// 進行調整;

int k1 = t, k2 = abs(prar[t]);

while ( true )

}} // 存放最大流;

int imaxflow = 0;

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

return imaxflow;

}int main()

; int pigs[maxn] = ;

int m;

int n;

scanf( "%d%d", &m, &n );

for ( int i = 0; i < n+2; ++i )

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

scanf( "%d", &pigs[i] );

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

else

}} scanf( "%d", &edges[i][n+1].c );

edges[i][n+1].f = 0;

} cout << ford( 0, n+1, n+2 ) << endl;

return 0;

}

/*

* 用了連續最短增廣演算法;

* 之前wa了一次, 也不知道改了**, 就稀里糊塗的對了;

* 用了16ms, 果然要快點;

*/#include #include #include #include using namespace std;

#define maxn 1005

#define inf 9999999

#define inf2 999999

#define min( a, b ) ( (a) <= (b)? (a):(b) )

#define abs( a ) ( (a) >= 0? (a) : -(a) )

// 邊的屬性結構;

struct edgetype

;edgetype edges[maxn][maxn]; // 鄰接矩陣, 當兩點之間不存在邊時,c和f都賦值為inf;

int flag[maxn]; // 標記, -1:未標記,0:已標記未檢查,1:標記並檢查, 回溯之後要標記為-1;

int prar[maxn]; // 標號的第乙個分量,用於存放父節點;

int alpha[maxn]; // 標號的第二個分量,存放可改進a;

int level[maxn]; // 各個頂點的等級;

void bfs( int s, int n )

if ( !level[i] && edges[i][u].c < inf && edges[i][u].f > 0 )

} }}

// 進行深搜, 搜尋的點, 匯點, 頂點個數;

int dfs( int s, int t, int n )

// 反向邊;

if ( edges[i][s].c < inf && edges[i][s].f > 0 )

}} flag[s] = -1;

return sumalpha;

}// 第乙個引數為源點,第二個為匯點;

int ford( int s, int t, int n )

// 存放最大流;

int imaxflow = 0;

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

return imaxflow;

}int main()

; int pigs[maxn] = ;

int m;

int n;

scanf( "%d%d", &m, &n );

for ( int i = 0; i < n+2; ++i )

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

scanf( "%d", &pigs[i] );

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

else

}} scanf( "%d", &edges[i][n+1].c );

edges[i][n+1].f = 0;

} cout << ford( 0, n+1, n+2 ) << endl;

return 0;

}

POJ1149 PIGS 最大流 優化建模

pigs 題目大意 有 m m 個豬圈,每個豬圈內有一些豬,有 n role presentation style position relative n n名顧客陸續到來,他們每個人能夠開乙個集合內的豬圈,並且能從這些豬圈中買走至多bi b i頭豬,在這個時候,我們還能對這些豬圈內的豬進行調動,每...

POJ 3080 Blue Jeans 三種暴力法

本題可以使用暴力法直接求解,思路也挺簡單的,不過實現起來也挺麻煩的。本題最暴力直接使用strstr過。這裡使用hash表的方法過,這種方法好像有個學名的,主要思路就是把乙個需要查詢的字串賦予乙個數值,那麼就可以把一串字串的比較轉換為乙個值的比較了,那麼就可以加速字串的查詢了。include incl...

poj1958 漢諾四塔問題(三種方法)

大意 漢諾塔公升級版,四根柱子,n個盤子,求最少移動次數 思路1 遞推 或者dp?把四塔轉換為三塔進行思考 假設當前要移動n個盤子,那麼就不如分為以下幾步 先將上面的i個盤子移到第2或3個塔上 四塔移動 再把剩下的 n i 個盤子移到最後乙個塔上 三塔移動 最後把在那i個盤子移到最後乙個塔上 注意 ...