zoukankan      html  css  js  c++  java
  • _bzoj1070 [SCOI2007]修车【最小费用最大流】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1070

    以后做网络流题目就是不能省内存。。。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    const int maxnd = 10100, maxe = 100005;
    
    int m, n, time[65][15], S, T;
    int head[maxnd], next[maxe], from[maxe], to[maxe], w[maxe], cap[maxe], flow[maxe], lb;
    int d[maxnd], p[maxnd], c[maxnd], que[maxnd], head_, tail, h;
    char inq[maxnd];
    
    inline void ist(int aa, int ss, int ww, int ca) {
    	to[lb] = ss;
    	from[lb] = aa;
    	next[lb] = head[aa];
    	head[aa] = lb;
    	w[lb] = ww;
    	cap[lb] = ca;
    	++lb;
    	
    	to[lb] = aa;
    	from[lb] = ss;
    	next[lb] = head[ss];
    	head[ss] = lb;
    	w[lb] = -ww;
    	cap[lb] = 0;
    	++lb;
    }
    inline bool spfa(int & co) {
    	memset(d, 0x3c, sizeof d);
    	memset(inq, 0, sizeof inq);
    	head_ = tail = 0;
    	que[tail++] = S;
    	inq[S] = 1;
    	d[S] = 0;
    	c[S] = 2147483647;
    	while (head_ != tail) {
    		h = que[head_++];
    		inq[h] = 0;
    		if (head_ == T + 3) {
    			head_ = 0;
    		}
    		for (int j = head[h]; j != -1; j = next[j]) {
    			if (flow[j] < cap[j] && d[to[j]] > d[h] + w[j]) {
    				d[to[j]] = d[h] + w[j];
    				p[to[j]] = j;
    				c[to[j]] = std::min(c[h], cap[j] - flow[j]);
    				if (!inq[to[j]]) {
    					inq[to[j]] = 1;
    					que[tail++] = to[j];
    					if (tail == T + 3) {
    						tail = 0;
    					}
    				}
    			}
    		}
    	}
    	if (d[T] == 0x3c3c3c3c) {
    		return false;
    	}
    	co += d[T] * c[T];
    	for (int i = T; i != S; i = from[p[i]]) {
    		flow[p[i]] += c[T];
    		flow[p[i] ^ 1] -= c[T];
    	}
    	return true;
    }
    inline int mcmf(void) {
    	int co = 0;
    	while (spfa(co));
    	return co;
    }
    
    int main(void) {
    	//freopen("in.txt", "r", stdin);
    	memset(head, -1, sizeof head);
    	memset(next, -1, sizeof next);
    	scanf("%d%d", &m, &n);
    	T = n * (m + 1) + 1;
    	for (int i = 1; i <= n; ++i) {
    		ist(S, i, 0, 1);
    		for (int j = 1; j <= m; ++j) {
    			scanf("%d", time[i] + j);
    		}
    	}
    	for (int j = 1; j <= m; ++j) {
    		for (int k = 1; k <= n; ++k) {
    			for (int i = 1; i <= n; ++i) {
    				ist(i, j * n + k, time[i][j] * k, 1);
    			}
    			ist(j * n + k, T, 0, 1);
    		}
    	}
    	printf("%.2f
    ", (double)mcmf() / (double)n);
    	return 0;
    }
    

      

  • 相关阅读:
    选校总结
    位运算
    剑指
    机器学习之梯度下降法
    leetcode1348 Tweet Counts Per Frequency
    UVA10308 Roads in the North 树的最长路径
    负数的处理POJ1179Polygon
    Roadblocks
    Bus Stop
    蒜头君的城堡之旅(动态规划)
  • 原文地址:https://www.cnblogs.com/ciao-sora/p/6189394.html
Copyright © 2011-2022 走看看