像做网站平台取什么名字好,深圳建网站哪个公司,网页游戏网站搭建,网站开发终止协议书POJ_3189 一开始题意各种理解错#xff0c;首先输入的那个矩阵第i行第j列的值表示的是奶牛i会第j个中意的牛棚#xff0c;最后求的range就相当于j的range#xff0c;至于range是变化的范围#xff0c;比如j在1、2变化#xff0c;那么range就应该是2#xff0c;也就是MAX-…POJ_3189 一开始题意各种理解错首先输入的那个矩阵第i行第j列的值表示的是奶牛i会第j个中意的牛棚最后求的range就相当于j的range至于range是变化的范围比如j在1、2变化那么range就应该是2也就是MAX-MIN1。 因此我们可以枚举range的下界和上届然后用二分图多重匹配判断是否有解当然用网络流判断也可以不过好像比较慢。在枚举range的时候可以做到O(N)比如现在range是[x,y]如果当前无解那么就扩大上届令yy1如果有解就缩小下届令xx1。 #includestdio.h
#includestring.h
#includealgorithm
#define MAXN 1010
#define MAXB 30
#define INF 0x3f3f3f3f
int N, B, yM[MAXB][MAXN], visy[MAXB], num[MAXB], limit[MAXB];
int g[MAXN][MAXB], LOW, HIGH;
void init()
{int i, j, k;for(i 0; i N; i )for(j 0; j B; j )scanf(%d, g[i][j]), -- g[i][j];for(i 0; i B; i ) scanf(%d, limit[i]);
}
int searchpath(int cur)
{int i, y, j;for(i LOW; i HIGH; i )if(!visy[g[cur][i]]){y g[cur][i], visy[y] 1;if(num[y] limit[y]){yM[y][num[y] ] cur; return 1;}for(j 0; j num[y]; j )if(searchpath(yM[y][j])){yM[y][j] cur;return 1; }}return 0;
}
int match()
{int i;memset(num, 0, sizeof(num[0]) * B);for(i 0; i N; i ){memset(visy, 0, sizeof(visy[0]) * B);if(!searchpath(i)) return 0;}return 1;
}
void solve()
{int ans INF;LOW HIGH 0;while(HIGH B){if(!match()) HIGH;elseans std::min(ans, HIGH - LOW 1), LOW;}printf(%d\n, ans);
}
int main()
{while(scanf(%d%d, N, B) 2){init();solve(); }return 0;
} 转载于:https://www.cnblogs.com/staginner/archive/2012/08/18/2645235.html