POJ 3189 枚举+最大流判可行性
2013-05-15 11:20
309 查看
这题即使不是我做过最坑的题,也是我今年遇到的有数的几道恶心题。
题意思路什么的都简单不叙述了。
主要讲一下这题坑的地方。
那就是。。。如果你边的数组开小了,那么就是TLE。没错,就是TLE。
这题我昨晚交了50发,一直T,我从头到尾把DINIC代码改了10遍以上,后来改的我一点脾气都没有了。
今天早上又来了10来发,还是T,我就从头开始写了一遍。这次抱着爆搞的心态,数组都开超大,没想到A了。
我就XXXXXXXXX了。
然后我把数组重新改小了,还是T。
瞬间我把昨天晚上的代码拿出来,改了下数组大小,也A了。
然后。。。就没有然后了。。。我去吃饭了。。。
题意思路什么的都简单不叙述了。
主要讲一下这题坑的地方。
那就是。。。如果你边的数组开小了,那么就是TLE。没错,就是TLE。
这题我昨晚交了50发,一直T,我从头到尾把DINIC代码改了10遍以上,后来改的我一点脾气都没有了。
今天早上又来了10来发,还是T,我就从头开始写了一遍。这次抱着爆搞的心态,数组都开超大,没想到A了。
我就XXXXXXXXX了。
然后我把数组重新改小了,还是T。
瞬间我把昨天晚上的代码拿出来,改了下数组大小,也A了。
然后。。。就没有然后了。。。我去吃饭了。。。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 100005//把这个改成1W你试试就知道了亲。亲测哦。 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x) (x<<1|1) #define REP(i,s,t) for(int i=(s);i<=(t);++i) #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) #define mp(a,b) make_pair(a,b) using namespace std; struct kdq { int s , e ,l, next ; } ed[Max] ; int head[1100] ,num ; void init() { mem(head,-1) ; num = 0 ; } void add(int s, int e ,int l) { ed[num].s = s ; ed[num].e = e ; ed[num].l = l ; ed[num].next = head[s] ; head[s] = num ++ ; ed[num].s = e ; ed[num].e = s ; ed[num].l = 0 ; ed[num].next = head[e] ; head[e] = num ++ ; } int cow[Max][100] ; int w[Max] ; int n , m ; int S, T; void build(int k,int k1) { S = 0 ; T = n + m + 1 ; REP(i,1,n) { REP(j,k,k1) add(cow[i][j] ,i + m ,1) ; add(i + m ,T,1) ; } REP(i,1,m)add(S,i,w[i]) ; } int deep[1100] ; int qe[Max * 100] ; int dinic_bfs() { mem(deep,-1) ; deep[S] = 0 ; int h = 0 ,t = 0 ; qe[h ++ ] = S ; while(h > t) { int tt = qe[t ++ ] ; for (int i = head[tt] ; ~i ; i = ed[i].next ) { int e = ed[i].e ; int l = ed[i].l ; if(l > 0 && deep[e] == -1) { deep[e] = deep[tt] + 1 ; qe[h ++ ] = e ; } } } return deep[T] != -1 ; } int dinic_dfs(int now ,int f) { if(now == T) return f ; int flow = 0 ; for (int i = head[now] ; ~i ; i = ed[i].next ) { int e = ed[i].e ; int l = ed[i].l ; if(l > 0 && (f - flow) > 0 && deep[e] == deep[now] + 1) { int mm = min(l,f - flow) ; int nn = dinic_dfs(e,mm) ; flow += nn ; ed[i].l -= nn ; ed[i ^ 1].l += nn ; } } if(!flow) deep[now] = -2 ; return flow ; } int dinic() { int flow = 0 ; while(dinic_bfs()) { flow += dinic_dfs(S,inf) ; } return flow ; } int solve() { int ans = inf ; REP(i,1,m) { REP(j,i,m) { init() ; build(i ,j) ; int aa = dinic() ; if(aa == n){ ans = min(ans,j - i + 1) ; if(ans == 1) return ans ; } } } return ans ; } int main() { #ifndef ONLINE_JUDGE freopen("acm.txt", "r", stdin); #endif scanf("%d%d",&n,&m) ; REP(i,1,n)REP(j,1,m)scanf("%d",&cow[i][j]) ; REP(i,1,m )scanf("%d",&w[i]) ; printf("%d\n",solve()) ; return 0; }
相关文章推荐
- POJ - 3189 Steady Cow Assignment 二分 + 枚举 + (最大流||二分图多重匹配)
- poj 3189 二分+枚举+最大流
- poj 3189 Steady Cow Assignment 【最大流】【枚举上下界 判断是否满流】
- 【最大流+dinic+二分枚举】北大 poj 3189 Steady Cow Assignment
- poj 3189(枚举加最大流)
- POJ 3189 枚举+最大流
- poj 3189(枚举+最大流)
- poj 3189 Steady Cow Assignment(最大流,枚举)
- POJ 3189 最大流 枚举
- POJ 3189--Steady Cow Assignment【二分图多重匹配 && 最大流求解 && 枚举 && 经典】
- POJ 2699 枚举+最大流
- poj 3189 Steady Cow Assignment(二分+最大流)
- POJ 3498 March of the Penguins(枚举+最大流)
- POJ 2455 Secret Milking Machine && 二分枚举 + 最大流
- poj 3498(枚举人数+最大流) 满满都是泪
- [省选前题目整理][POJ 2699]The Maximum Number of Strong Kings(暴力枚举+最大流)
- POJ1964/UVALive 3029 -City Game -求最大子矩形-(暴力枚举/dp)
- POJ 3498 —— March of the Penguins (枚举+最大流)
- poj 2699 最大流+枚举
- POJ 3189 Steady Cow Assignment(网络流之最大流+二分构图)