/*
題意:給出n個箱子,箱子可以放在箱子裡邊,但是要滿足放在裡邊的箱子的長要小於外邊的長,寬要滿足小於外邊的寬,高要滿足小於外邊的高。求露在外邊的箱子最多有多少個。
思路:思路:最小路徑覆蓋,如果滿足條件:wi < wj , li < lj , and hi < hj,那麼i->j連邊,然後就是求最大匹配。
最小路徑覆蓋=頂點數-最大匹配。
*/#include "stdio.h"
#include "string.h"
#include "queue"
#include "algorithm"
using namespace std;
const int maxn = 505;
const int inf = 1<<30;
int nx,ny;
int dis;
int map[maxn][maxn]; //二分圖
int cx[maxn],cy[maxn]; //cx[i] 表示左集合i頂點所匹配到的右集合頂點序號 cy[i]表示右集合i頂點所匹配到的左集合頂點序號
int dx[maxn],dy[maxn]; //dx[i] 表示左集合i頂點的距離標號 dy[i] 表示右集合i頂點的距離標號
bool vis[maxn]; //尋找增廣路時 的標記陣列
struct node
doll[maxn];
bool cmp( node a, node b )
//hopcroft-karp演算法 有點類似dinic 都是先對圖bfs分層再沿層數dfs找增廣路
//***********************************=核心
bool searchpath()
} while( !que.empty() )
}} }
return dis != inf;
}int findpath( int u )
} }return false;
}int maxmatch()
for( i = 1; i <= ny; i++ )
while( searchpath() )
for( i = 1; i <= nx; i++ )
}} return ans;
}//***********************************=
int main()
} for( i = 1; i <= nx; i ++ )
sort( doll+1,doll+nx+1,cmp );
for( i = 1; i <= nx; i ++ )
}} printf("%d\n",nx-maxmatch() );
} return 0;
}
hdu1960 最小路徑覆蓋
題意 給你明天的計程車訂單,訂單中包含每個人的起點和終點座標,還有時間,如果一輛計程車想接乙個乘客必須在每個訂單前1分鐘到達,也就是小於等於time 1,問你完成所有訂單要最少多少量計程車.思路 典型的最小路徑覆蓋,對於最小路徑覆蓋,我們可以這麼理解,最次的情況是n輛,而只要找到那麼一組可以與其匹配...
HDU1151最小路徑覆蓋
dag圖 無迴路有向圖 的最小路徑覆蓋 用盡量少的不相交簡單路徑覆蓋有向無環圖 dag 的所有頂點,這就是dag圖的最小路徑覆蓋問題。最小路徑覆蓋數 節點數 最大匹配數 include include include using namespace std const int maxn 200 in...
最小路徑覆蓋問題(最小路徑覆蓋)
本題題目描述可以發現很明顯的最小路徑覆蓋問題,又因為最小路徑覆蓋 節點數 二分圖最大匹配數,所以本題可以用匈牙利演算法求出二分圖最大匹配數,也可以向第一題那樣用網路流模型求出最大匹配數。本題建模時不同在於,每個點要分成兩個點,乙個為起點,乙個為終點,再來求二分圖最大匹配。然後麻煩就在於本題也要輸出路...