/*
* 第一道最大流, 寫的有點挫, 按照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個盤子移到最後乙個塔上 注意 ...